具有硬编码值的LinqPad问题

具有硬编码值的LinqPad问题,linq,linqpad,Linq,Linqpad,一直在玩LinqPad(顺便说一句,我非常喜欢它),发现如果我像这样将值硬编码到Select查询中,它不会喜欢它: from id in TEST select new { Id = 0 } (在SQL选项卡中)显示为: 我以为LinqPad会按照 SELECT 0 AS Id FROM TEST t0 有没有办法在LinqPad中获得该行为?您给出的LINQ查询只是针对测试中的每个记录显示一个Id设置为0的匿名对象。将常量发送到SQL server只是为了让它

一直在玩LinqPad(顺便说一句,我非常喜欢它),发现如果我像这样将值硬编码到Select查询中,它不会喜欢它:

from id in TEST 
select new 
   {
       Id = 0
   }
(在SQL选项卡中)显示为:

我以为LinqPad会按照

SELECT 0 AS Id
FROM TEST t0

有没有办法在LinqPad中获得该行为?

您给出的LINQ查询只是针对测试中的每个记录显示一个Id设置为0的匿名对象。将常量发送到SQL server只是为了让它再次返回它会/可能会使查询结果变大。这是LINQ的优化之一。如果LINQ真的很好,它只会生成一个计数,并返回那么多的0,但是优化器还不是很好,所以它会返回包含null的行

LinqPad的结果应该为测试中的每个记录显示一个Id属性设置为0的匿名记录,就像您请求的那个样。更优化的查询是:

Enumerable.Range(0,TEST.Count()).Select(r=>new {Id=0})

在我的测试环境中,一个包含约10000行的表在0.035秒内执行,而您的原始版本在0.070秒内执行,并且差异随着行数的增加而增大。

这个问题被问及Joe Albahari(LinqPad的作者)的回答

首先,这是您正在使用的ORM的一个函数-在本例中, LINQ到SQL,而不是LINQPad。然而,碰巧的是,LINQtoSQL正在做 这是对的

LINQtoSQL试图以最有效的方式满足您的查询 可能的所以,如果你要一个常数,它就认为它可以提供 常数,无需往返服务器。除非有一个 它需要在查询中包含该常量以使其生效的原因 有效的,它将省略它


我认为这是因为在select子句中,它从表中放入了它所需要的所有数据。因为它需要一个,所以它设置为空。我的问题是,为什么它会将常量值发送到数据库,只是为了让它们返回。在本例中,它只是一个4字节的整数,但如果返回1000行数据,则将是4000字节。相反,如果它是一个长字符串,那么它会更大。这种优化只会最小化网络流量。为什么要将这些详细信息放在SQL中?这很好,但我只是想知道为什么LinqPad将其视为SELECT NULL而不是SELECT 0,因为idIt不仅使用NULL而不是0,还从SELECT语句中删除了所有不访问数据库的列。如果您的语句是
selectnew{id.Field1,id.Field2,id=1,Deleted=false,Date=DateTime.Now}
您将从测试中获得类似
selectfield1,Field2的内容。在您的情况下,您实际上没有包括任何列,但由于
从测试中选择
无效,它使用
从测试中选择空值
。将此标记为答案。我不想深入了解细节,但我需要返回一个select中的常量,并将其与另一个使用列的select合并。这在运行时工作,所以我希望它也能在LinqPad中工作。哦,好吧。。。。
Enumerable.Range(0,TEST.Count()).Select(r=>new {Id=0})