У меня есть генератор запросов, основанный на 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);
Любая помощь по разрешению этого будет оценена.