LINQ Expression获取成员值并可以转换为SQL?

时间:2017-08-16 10:50:13

标签: c# .net linq tsql

我有一个复杂的查询,其中模型实体的某些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的变量或方法中?

1 个答案:

答案 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);