Linq Expression Convert не через Expression.Convert
От: Alexandr Sulimov Украина www.ase.com.ua
Дата: 13.08.14 19:07
Оценка:
    public DateTime    DateTime1 { get; set}
    
    q.Where(x => SqlFunctions.DatePart("yyyy", x.DateTime1) == 2014);


Этот код хорошо преобразовывается в SQL

Но мне нужно построить такое x => SqlFunctions.DatePart("yyyy", x.DateTime1) == 2014 через Expression

memberExpression = x.DateTime1
  public static Int32? DatePart(String datePartArg, DateTime? date)

  var sqlFunctions = typeof(SqlFunctions).GetMethods(BindingFlags.Static | BindingFlags.Public).Where(x => x.Name == "DatePart").FirstOrDefault(x => x.GetParameters().Count() == 2 && x.GetParameters()[1].ParameterType == typeof(Nullable<DateTime>));

  //1 - не рабочий код  
  //т.к. DatePart принимает Nullable<DateTime>
  Expression exprY = Expression.Call(sqlFunctions, Expression.Constant("yyyy"), memberExpression);
  //2 - не рабочий код  
  //т.к. Expression будет типа {DatePart("yyyy", Convert(x.DateTime1))} и не сможет потом привести его в SQL
  Expression exprY = Expression.Call(sqlFunctions, Expression.Constant("yyyy"), Expression.Convert(memberExpression, typeof(Nullable<DateTime>)));


Как привести DateTime1 к Nullable<DateTime> чтобы небыло Convert
получился аналог SqlFunctions.DatePart("yyyy", x.DateTime1) == 2014
Смелости хватает только под ником писать?
Re: Linq Expression Convert не через Expression.Convert
От: scale_tone Норвегия https://scale-tone.github.io/
Дата: 13.08.14 22:13
Оценка: 20 (1) +1
Здравствуйте, Alexandr Sulimov, Вы писали:

AS>Как привести DateTime1 к Nullable<DateTime> чтобы небыло Convert

AS>получился аналог SqlFunctions.DatePart("yyyy", x.DateTime1) == 2014

Странно, у меня вроде сработало:

// так, кстати, гораздо удобнее получать нужный MethodInfo
var sqlFunctions = ((Func<string, DateTime?, int?>) SqlFunctions.DatePart).Method;

var exprY = Expression.Call
    (
        sqlFunctions,
        Expression.Constant("yyyy"),
        Expression.Convert(memberExp, typeof(DateTime?))
    );

var constructedWhereExp = Expression.Equal
    (
        exprY,
        Expression.Convert(Expression.Constant(2014), typeof(int?))
    );

var whereLambda = Expression.Lambda<Func<MyEntity, bool>>(constructedWhereExp, paramExp);

var q = GetEntities().Where(whereLambda);
foreach (var en in q)
{
    Console.WriteLine(en.DateTime1);
}


Может, Вы выделенный Convert забыли? 2014 тоже нужно к Nullable<int> приводить.
Или, может, опять не тот MethodInfo?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.