Sql server 为什么Linq to SQL会添加不必要的COUNT()?

Sql server 为什么Linq to SQL会添加不必要的COUNT()?,sql-server,linq,linq-to-sql,Sql Server,Linq,Linq To Sql,这是我的桌子: create table customer ( cid int primary key, name varchar(32) ) create table ord ( oid int primary key, cid int foreign key references customer, address varchar(20) ) 下面是我的Linq to SQL语句: var aaa = from c in db.Customer

这是我的桌子:

create table customer 
(
    cid int primary key,
    name varchar(32)
)

create table ord 
(
    oid int primary key,
    cid int foreign key references customer,
    address varchar(20)
)
下面是我的Linq to SQL语句:

var aaa = from c in db.Customer
          select new { c, o = c.Ord.ToList() };
下面是由Linq到SQL生成的无法解释的查询:

SELECT 
    [t0].[cid] AS [Cid], [t0].[name] AS [Name], [t1].[oid] AS [Oid], 
    [t1].[cid] AS [Cid2], [t1].[address] AS [Address], 
    (SELECT COUNT(*)
     FROM [dbo].[ord] AS [t2]
     WHERE [t2].[cid] = [t0].[cid]) AS [value]
FROM [dbo].[customer] AS [t0]
LEFT OUTER JOIN [dbo].[ord] AS [t1] ON [t1].[cid] = [t0].[cid]
ORDER BY [t0].[cid], [t1].[oid]

我想知道如何摆脱伯爵的角色。这完全没有必要

LINQ需要计数*来确定将为o=c.Ord.ToList返回的条目数。

是否可能相关?为什么会有这样的需要?他们就不能在事情发生的时候继续扩大清单吗?我的问题是,这个查询生成了一个查询计划,它是N^2,其中N是每个客户的订单数量,在我的例子中,这是很大的。我对此很失望。感谢您的洞察力。考虑SQL如何返回数据-您有一个T0客户字段重复匹配到每个T1 ORD字段在一个扁平的记录列表中。SQL只返回表。不知何故,LINQ必须创建一个与n ord记录合并的客户记录。有了可用的计数,这就容易多了。如果不查询每个客户的数据库中的ord记录,我看不出如何以不同的方式完成。我假设您使用的是实体框架?如果在数据库中从c改为c,会发生什么?客户选择c.Includeord?这是老式的linq2sql,而不是EF。我的设想是这样的:LINQ正在读取传入的记录,如果没有提前创建,它将为每个记录创建一个新的Customer对象,然后将结果行集的Order部分添加到由Customer id查找的相应Customer中。不需要知道您收到了多少订单,只要在收到订单时继续堆积即可。哦,好吧。