LinqPad问题是硬编码值

时间:2015-07-08 15:06:35

标签: linq linqpad

一直在玩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中获得这种行为?

2 个答案:

答案 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   之所以需要在查询中包含该常量来实现它   有效,它会将其遗漏。