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
Смелости хватает только под ником писать?
Здравствуйте, 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?