【问题标题】:Make Entity Framework reuse a value使实体框架重用一个值
【发布时间】:2018-08-01 18:59:29
【问题描述】:

每当我需要用同一个值过滤多个值时,如下:

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

它会生成这样的东西:

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

然后将值传递两次。有没有办法让生成的 sql 更干净,只通过 lastupdatedDate 一次并重用变量?

【问题讨论】:

  • 我认为这不可能或不可取。我怀疑 EF 正在创建单独的参数,因为它很简单。任何合并参数的逻辑都会增加包含多个参数的所有查询的查询生成开销,即使没有重叠。
  • 解决这个问题并不是很好地利用你作为程序员的时间。 The Sad Tragedy of Micro-Optimization Theater。 ...这可能是让自己陷入微优化剧院最可悲的事情——它分散了你真正目标的注意力:编写更好的代码。

标签: c# sql entity-framework-6


【解决方案1】:

很遗憾,这是 EF6 查询翻译缺陷。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2022-08-08
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    相关资源
    最近更新 更多