一直在玩LinqPad(真的非常喜欢它)并发现如果我将值硬编码到我的Select查询中就不会喜欢它了:
from id in TEST
select new
{
Id = 0
}
显示(在SQL选项卡中):
SELECT NULL
FROM TEST t0
我认为LinqPad会产生类似
的内容SELECT 0 AS Id
FROM TEST t0
有没有办法在LinqPad中获得这种行为?
答案 0 :(得分:1)
你给出的LINQ查询只是说一个匿名对象,对于测试中的每个记录,Id设置为0。将常量发送到SQL服务器只是让它再次返回它会/可能只是使查询结果更大。这是LINQ的优化之一。如果LINQ真的很好,它会产生一个计数,并返回那么多0,但优化器还不是那么好,所以它返回包含null的行。
LinqPad的结果应显示一条匿名记录,其中Id属性设置为0,用于测试中的每条记录,就像您要求它一样。更优化的查询将是:
Enumerable.Range(0,TEST.Count()).Select(r=>new {Id=0})
在我的测试环境中,一个包含~10,000行的表在0.035秒内执行,而原始版本在0.070秒内执行,并且差异随着行数的增加而增加。
答案 1 :(得分:1)
在http://forum.linqpad.net/discussion/312/how-to-make-linqpad-sql-window-return-constants已经询问了这个问题,其中Joe Albahari(LinqPad的作者)回复了
首先,这是您正在使用的ORM的功能 - 在这种情况下, LINQ to SQL,而不是LINQPad。但事实上,LINQ to SQL正在发挥作用 这是正确的。
LINQ to SQL尝试以最有效的方式满足您的查询 可能。因此,如果你要求一个常数,它表明它可以提供 没有往返服务器和返回的常量。除非有a 之所以需要在查询中包含该常量来实现它 有效,它会将其遗漏。