我有一个复杂的查询,其中模型实体的某些DateTime成员被多次使用,但并不总是相同的成员。我想知道我是否可以将成员的“获取”放在表达式中,所以我不必重复那段代码。
我当前代码的简化版本如下所示:
var getTargetDate = ((Expression<Func<Order, DateTime>>)(o => o.OrderDate)).Compile();
if (delivery)
getTargetDate = ((Expression<Func<Order, DateTime>>)(o => o.DeliveryDate)).Compile();
return orders.Where(o => getTargetDate(o) >= fromDate && getTargetDate(o) < toDate);
此代码编译,但给我运行时异常:
抛出异常:System.Data.Linq.dll中的'System.NotSupportedException'
其他信息:方法'System.Object DynamicInvoke(System.Object [])'没有支持的SQL转换。
有没有办法将“获取”DateTime放在可以转换为SQL的变量或方法中?
答案 0 :(得分:1)
这并不能真正回答这个问题,但它确实提供了解决其中代码重复问题的方法 将所需成员和实体本身放在匿名对象中,在成员上执行原始查询的相关部分,然后选择原始实体:
orders = orders.Select(o => new { o,
TargetDate = delivery ? o.DeliveryDate : o.OrderDate
})
.Where(o => o.TargetDate >= fromDate && o.TargetDate < toDate)
.Select(o => o.o);