2012-09-28 76 views
0

這裏是C#/ LINQ的:LINQ到SQL:通過生成許多SQL簡單組查詢

Fbc_tickets.GroupBy(t => t.Fbt_household_id) 

LinqPad告訴我這是被翻譯成(MySQL的):

SELECT t0.fbt_household_id 
FROM fbc_ticket AS t0 
GROUP BY t0.fbt_household_id 

SELECT t0.fbc_ticket_id, t0.fbt_client_id, ... 
FROM fbc_ticket AS t0 
WHERE ((t0.fbt_household_id IS NULL AND @n0 IS NULL) OR (t0.fbt_household_id = @n0)) 
-- n0 = [1] 

SELECT t0.fbc_ticket_id, t0.fbt_client_id, ... 
FROM fbc_ticket AS t0 
WHERE ((t0.fbt_household_id IS NULL AND @n0 IS NULL) OR (t0.fbt_household_id = @n0)) 
-- n0 = [2] 

... 

爲什麼產生所有這些查詢?我期望更多的東西類似於

SELECT * FROM fbc_ticket GROUP BY fbt_household_id 

就是這樣......

fbt_household_id是一個unsigned int和非空的。

+0

你在用你的Linq結果做什麼?循環播放它? –

+0

不要相信LinqPad,運行查詢並使用SQL分析器查看實際提交的內容。您得到的結果需要提交更多的'Fbc_tickets.GroupBy(t => t.Fbt_household_id)'。你是否在其他地方使用查詢(或喜歡它的人)? – Trisped

+0

@JoachimIsaksson:不,我沒有做任何事情。這是整個事情。我只想將SQL退出。 – mpen

回答

2

我一直在linq-to-sql中看到這個。首先查詢獲取分組鍵,然後按每個鍵查詢以填充組。我不知道爲什麼這樣實施,但恐怕你沒有辦法做到。實體框架在這個特定領域(不在其他領域)更聰明。當我連接到現有的linq-to-sql上下文(並且不要讓它創建上下文)時,Linqpad也會這樣做,所以我認爲它與Linqpad沒有任何關係。

+0

是的,我想像它是SQL驅動程序「智商」那麼EF和Linq-to-SQL有什麼區別呢?據我所知,LinqPad正在創建具有屬性的C#類(或者更像是一個CLR程序集),就像EF模型一樣,然後超越它他們使用完全相同的驅動程序將表達式樹(Linq)翻譯成SQL? – mpen

+1

當然,Linqpad沒有查詢引擎,如果連接到數據庫,它會建立一個帶有linq-to-sql上下文的'AppDomain'。幾乎沒有(可能永遠不會)每個linq語句發出一個以上的查詢,這個查詢有時可能很怪,但至少它是一次性的,要在Linqpad中使用EF,你可以連接到一個包含EF上下文的程序集。 –