2011-08-25 65 views

回答

42

這肯定不是這樣的。

LINQ-to-Objects是IEnumerable<T>上的一組擴展方法,它們允許您對任意的對象序列執行內存查詢操作。這些方法在必要時接受簡單的委託。

LINQ-to-Entities是LINQ提供商,它在IQueryable<T>上有一組擴展方法。這些方法構建了一個表達式樹(這就是爲什麼代理實際上被傳遞爲Expression<>),並且提供者將基於對該表達式樹的解析來構建SQL查詢。

作爲一個例子,考慮以下查詢:

var query1 = mydb.MyEntity.Select(x => x.SomeProp).Where(x => x == "Prop"); 
var query2 = mydb.MyEntity.Select(x => x.SomeProp).AsEnumerable().Where(x => x == "Prop"); 

第一個查詢是將建立一個表達式樹由選擇和其中,具有實際上視爲LambdaExpression S上的2個lambda表達式。 LINQ-to-Entities提供程序將把它翻譯成既可選擇又可過濾的SQL。

第二個查詢插入AsEnumerable(),這將強制查詢的其餘部分使用LINQ到對象。在這種情況下,提供程序將僅基於選擇生成SQL,從數據庫中返回所有這些記錄,然後過濾將發生在內存中。顯然,這可能會慢很多。

+1

是否有任何方法來篩選一個linq對象查詢的條件或它是否總是縮小到第一個動作之前處理下一個? –

+1

這取決於;如果你只想從數據庫中獲取* all *記錄,然後在內存中對它們執行操作,你可以在'Select()'之前放置'AsEnumerable()'*,然後做你想做的事情。但總的來說,將事情分開是更好的辦法。如果你有'IEnumerable ',那麼你將使用LINQ到對象。如果不是,那麼數據庫可能會更有效率。 – dlev

+0

@dlev你沒有回答他問的問題。 –

2

Linq2Entities代表經由ADO.NET實體框架(數據庫)

Linq2Objects表示在存儲器中的數據(本地對象)查詢查詢數據。

10

L2o用於記憶中的對象。 L2e查詢數據庫。

7

LINQ到對象 術語「LINQ到對象」指的是使用LINQ查詢的直接任何的IEnumerable或IEnumerable集合,而不需要使用中間LINQ提供商或API的諸如LINQ到SQL或LINQ到XML。您可以使用LINQ來查詢任何可枚舉的集合,如List,Array或Dictionary。該集合可能是用戶定義的,也可能是由.NET Framework API返回的。

從基本意義上說,LINQ to Objects代表了一種新的集合方法。在舊的方式,你必須編寫複雜的foreach循環,指定如何從集合中檢索數據。在LINQ方法中,您編寫描述您想要檢索的內容的聲明性代碼。

裁判:http://msdn.microsoft.com/en-us/library/bb397919.aspx

LINQ到實體 LINQ到實體提供語言集成查詢(LINQ)支持,使開發人員能夠編寫使用Visual Basic或Visual C#對實體框架概念模型的查詢。針對實體框架的查詢由命令樹查詢表示,該查詢根據對象上下文執行。 LINQ to Entities將語言集成查詢(LINQ)查詢轉換爲命令樹查詢,針對實體框架執行查詢,並返回可由實體框架和LINQ使用的對象。以下是創建和執行LINQ to Entities查詢的過程: Ref:http://msdn.microsoft.com/en-us/library/bb386964.aspx