每当我需要用相同的值过滤多个值时,如下所示:

.Where(lead => lead.UpdateDate >= lastupdatedDate
|| lead.Address.lasUpdateDate >= lastupdatedDate
)


它会生成如下内容:

select *
from lead
where UpdateDate >= @p__linq__1
or lasUpdateDate >= @p__linq__2


然后将值传递两次。有没有一种方法可以使生成的sql更加整洁,并使它仅通过一次lastupdatedDate并重用该变量?

最佳答案

不幸的是,这是EF6查询翻译缺陷。

我知道的唯一(丑陋)的解决方法是通过使用两个中间投影来模拟let子句-首先将变量和query元素包装为匿名类型,其次在使用包装的变量应用过滤器后将元素解包装:

.Select(lead => new { lead, lastupdatedDate }) // (1)
.Where(e => e.lead.UpdateDate >= e.lastupdatedDate
    || e.lead.Address.lasUpdateDate >= e.lastupdatedDate)
.Select(e => e.lead) // (2)

10-06 12:00