2017-08-15 16 views
0

這裏是我的表:爲什麼Linq-to-SQL添加不必要的COUNT()?

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到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] 

我想了解如何擺脫COUNT(*)部分。這完全沒有要求!

+1

可能有關係嗎? https://stackoverflow.com/questions/11997048/why-does-linq-2-sql-create-extra-unnecessary-objects/12045296#12045296 – DenNukem

回答

1

LINQ需要COUNT(*)才能確定將爲o = c.Ord.ToList()返回的條目數。

+0

爲什麼會有這種需求?他們難道不能一直在擴大名單嗎?我遇到的問題是,這個查詢生成的查詢計劃是N^2,其中N是每個客戶的訂單數量(在我的情況下這是很大的數量)。我很沮喪。感謝您的洞察力。 – DenNukem

+0

考慮SQL如何返回數據 - 您有't0'(客戶)字段重複匹配到記錄的平坦列表中的每個't1'(ord)字段。 (SQL只返回表。)不知何故,LINQ必須創建一個客戶記錄,並與其中的n個記錄合併。計數可用使得這更容易。如果不查詢ord記錄的每個客戶的數據庫,我不知道如何做不同。我假設你正在使用實體框架?如果更改爲'(從db.Customer中的c選擇c).Include(「ord」)''會發生什麼? – NetMage

+0

這是老派的linq2sql,不是EF。我想像是這樣的:LINQ正在讀取傳入記錄,併爲每個記錄創建一個新的Customer對象(如果以前未創建),然後將結果行集的Order部分添加到相應的Customer(由客戶ID查找) 。沒有必要知道你有多少訂單 - 只要在進貨時繼續堆放它們。哦,好吧。 – DenNukem

相關問題