Я пытаюсь использовать выражения для динамического создания операций сравнения для использования с Entity Framework Core 2.2.Работает нормально со всем, кроме даты.
Это запрос
new System.Linq.Expressions.Expression.MethodCallExpressionProxy(((Remotion.Linq.QueryableBase<ORMModel.Sale>)tq).Expression).DebugView
.Call System.Linq.Queryable.Where(
.Constant<Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[ORMModel.Sale]>(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[ORMModel.Sale]),
'(.Lambda #Lambda1<System.Func`2[ORMModel.Sale,System.Boolean]>))
.Lambda #Lambda1<System.Func`2[ORMModel.Sale,System.Boolean]>(ORMModel.Sale $Sale) {
$Sale.CreateDT > (System.DateTime).Constant<System.DateTime>(12/25/2018 5:00:00 AM)
}
Это ошибка, которую я получаю
System.Data.SqlClient.SqlError
Преобразование не выполнено, когда выполняется преобразование даты и/ или время из символьной строки.
Я использовал это значение даты непосредственно в SQL Server Management Studio, и оно выполняется.
Любая помощь или подсказки для бестолковых оценили.Слишком много гуглят и никуда не денется.Каждый пример - строки SQL, а не динамические выражения.
public static Expression GetBinaryExpression<TSource>(string propertyName, int comparer, dynamic valueIn)
{
PropertyInfo pi = GetPropertyInfo<TSource>(propertyName);
Type pt = pi.PropertyType;
var parameter = Expression.Parameter(typeof(TSource), typeof(TSource).Name);
var property = Expression.Property(parameter, propertyName);
dynamic valueTyped;
if (IsNullableType(pt))
{
valueTyped = Convert.ChangeType(valueIn, Nullable.GetUnderlyingType(pt));
}
else
{
valueTyped = Convert.ChangeType(valueIn, pt);
}
var constant = Expression.Constant(valueTyped);
var val = Expression.Convert(constant, pt);
Expression exp = null;
switch (comparer)
{
case 1:
exp = Expression.Equal(property, val);
break;
case 2:
exp = Expression.NotEqual(property, val);
break;
case 3:
exp = Expression.GreaterThan(property, val);
break;
case 4:
exp = Expression.GreaterThanOrEqual(property, val);
break;
case 5:
exp = Expression.LessThan(property, val);
break;
case 6:
exp = Expression.LessThanOrEqual(property, val);
break;
}
if (exp.CanReduce) exp = exp.Reduce();
return Expression.Lambda<Func<TSource, Boolean>>(exp, parameter);
}
private static bool IsNullableType(Type type)
{
return type.IsGenericType &&
type.GetGenericTypeDefinition().Equals(typeof(Nullable<>));
}
Я ожидаю возвращения прекрасного набора результатов вместо раздражающей ошибки.