Поле DateTime генерирует ошибку в генераторе запросов на основе дерева выражений для EFCore 3.1.1 - PullRequest
1 голос
/ 27 февраля 2020

У меня есть генератор запросов, основанный на C# деревьях выражений, которые я использую для подачи условия Where IQueryable в EFCore 3.1. Механизм состоит в том, что он анализирует объект с именем FilterCriterion, в который он включил авто свойства, такие как Поле типа строки, Значение объекта типа, Операция Expression типа enum. В последней точке генерации объекта Expression непосредственно перед тем, как он будет связан с Lambda>, у меня есть такой метод:

    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();

выдает ошибку: значение не может быть нулевым. (Параметр 'key') '

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

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

Любая помощь по разрешению этого будет оценена.

...