2012-06-04 134 views
1

我有EF小問題。我正在一張大桌子上進行查詢,並且需要很長時間。我想我找到了原因,但找不到解決辦法;EF不包括在哪裏條款

我的LINQ查詢看起來是這樣的:

IEnumerable<string> o = (from P in Table where P.ITEMID == itemid && P.IMAGESIZE == size select P.PATH); 
return o.Any() ? o.FirstOrDefault() : null; 

我希望這產生具有where子句的SQL查詢,但它實際上產生的是:

SELECT 
[Extent1].[ITEMID] AS [ITEMID], 
[Extent1]......... 
snap 10 columns 
FROM [dbo].[TABLE] AS [Extent1] 

where子句和選擇(我嘗試只選擇一列)在枚舉之後執行。我想要它做的是用where子句產生一個SQL查詢並只選擇一列。

我在做什麼錯?

+3

剛剛起來,o.Any()? o.FirstOrDefault():null是多餘的。如果未找到匹配項,o.FirstOrDefault()將返回null。 –

+0

什麼是「表」? –

+0

我現在把null放在那裏,我實際上返回了一些東西,但不想在這裏發佈,它不影響查詢 – reinder

回答

1

由於您正在創建IEnumerable<string>類型的對象,因此EF會在第一行中運行此查詢。然後在內存集中執行Any()FirstOrDefault()。 如果您想「繼續」編寫linq語句並最終運行查詢;只要去IQueryable<T>

IQueryable<string> o = (from P in Table where P.ITEMID == itemid && P.IMAGESIZE == size select P.PATH); 
return o.SingleOrDefault(); 

但是正如Ryan Bennett所建議的那樣,它更易於使用;

return Table.Where(p => p.ITEMID == itemid && P.IMAGESIZE == size).SingleOrDefault().PATH; 
+0

對任何和FirstOrDefault都是真的,但是WHERE應該已經被執行了數據庫,不在內存中。 –

+0

謝謝!這解決了它。我從來不知道IEnumerable以這種方式工作。在更多的情況下,IQueryable似乎是可以使用的。這是linq的懶惰進來的地方嗎? – reinder

+0

實際上,如果您在可查詢對象上編寫linq語句,EF將以延遲執行方式工作。但是,當您將可查詢對象轉換爲「固體」類型時,如IEnumerable,它只是執行查詢。作爲一個總結,EF推遲執行,直到IQueryable對象被轉換爲「實體」類型。 – daryal

0
return table.FirstOrDefault(P => P.ITEMID == itemid && P.IMAGESIZE == size); 

我相信這是你要完成的任務。這會在你的SQL中給你一個where子句,並立即返回記錄或null。