Поле 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
Сообщение говорит вам, что ключевая переменная не имеет значения. Вам нужно что-то предоставить, даже если это ноль.