behnami Ответов: 1

Поле Datetime выдает ошибку в генераторе запросов на основе дерева выражений для efcore 3.1.1


У меня есть генератор запросов на основе C# деревья выражений, которые я использую его, чтобы накормить, где состояние интерфейса IQueryable в<Т> В EFCore 3.1. Механизм заключается в том, что он анализирует объект, называемый FilterCriterion, в которых оно включено автоматическое свойства, такие как поле типа String значение типа object, OperationExpression типа перечисление. В последней точке генерации объекта выражения непосредственно перед тем,как он будет прикован к Lambda<Func<T, bool>>, У меня есть такой метод:

private static Expression GetConstantExpressionWithProperOperatorSpecified(
   Type lastInnerType,
   MemberExpression memberExpression,
   object propertyValue,
   OperationExpression operationToCheckWith)
{
   Expression result = null;
   MethodInfo contains = null;
   switch (operationToCheckWith)
   {
      case OperationExpression.Equals:
         if (TypeHelper.GetTypeAliasName(lastInnerType) == "DateTime" || TypeHelper.GetTypeAliasName(lastInnerType) == "DateTime?")
         {
            var dateTimeVariable = Expression.Variable(lastInnerType);
            var res = Expression.Assign(dateTimeVariable, Expression.Constant(propertyValue, lastInnerType));
            result = Expression.Equal(memberExpression,  dateTimeVariable);
         }
         else
         {
            result = Expression.Equal(memberExpression, Expression.Constant(propertyValue, lastInnerType));
         }
         break;
      // ...
   }


А в коде, который является клиентом этого метода, когда он доходит до Метода Count() :

var dbSet = ((CRMNewDbContext)_orderDbContext).Orders;
IQueryable<Order> queryable = null;
var findCriteria = (OrderFindCriteria)orderFindCriteria;
queryable = ApplyIncludes(dbSet);
var filteredQueryable = ApplyCriteriaOnQueryable(queryable, findCriteria);
filteredQueryable = ApplySortCriteria(filteredQueryable, findCriteria.Sorts);
var total = filteredQueryable.Count();


это приводит к ошибке:
Value cannot be null. (Parameter 'key')'


Я бы надеялся, что это сработало точно так же, как когда мы регулярно вводим выражение вручную в коде, как это:

var rightVal = Convert.ToDateTime("2020-02-27");
orderQueryable = orderQueryable.Where(order => 
order.OrderDate == rightVal);


но это не работает.

Что я уже пробовал:

Попробуйте преобразовать и рассматривать дату и время как строку.

Richard MacCutchan

Сообщение говорит вам, что ключевая переменная не имеет значения. Вам нужно что-то предоставить, даже если это ноль.

1 Ответов

Рейтинг:
0

Richard Deeming

Expression.Variable используется для объявления локальной переменной в выражении блока с несколькими операторами. Вы пытаетесь создать выражение с одним оператором, поэтому не можете использовать его Variable здесь.

Насколько я вижу, вам не нужно делать ничего другого для меня. DateTime значения; просто передайте значение в Expression.Constant, и сравните его с членом.

case OperationExpression.Equals:
    result = Expression.Equal(memberExpression, Expression.Constant(propertyValue, lastInnerType));
    break;


behnami

Да, вы правы. Наконец я обнаружил, что если тип DateTime в базовом поле базы данных изменяется на datetime2, то он работает так же, как и в предыдущей версии EF.