2012-02-13 12 views
0

我需要通過使用LINQ在ADO.NET模型中執行查詢。 我對我的網上商店WebStoreEntities的數據庫有一個EF類,我需要找到當前處於折扣狀態的表Products中的所有產品。 WebStoreEntities的實例稱爲webStoreDB在LINQ中執行組合查詢是否更快地調用現有函數或編寫整個查詢?

我已經可用的查詢所有的產品從數據庫的方法:

public IList<Products> GetAllProducts() 
{ 
    return webStoreDB.Products.ToList(); 
} 

爲了寫有簽名IList<Products> GetAllDiscountProducts()的方法檢索所有的打折產品,是它更快地寫:

return webStoreDB.Products.Where(m => Equals(m.discounted, 1)).ToList(); 

return GetAllProducts().Where(m => Equals(m.discounted, 1)).ToList(); 

回答

3
return webStoreDB.Products.Where(m => Equals(m.discounted, 1)).ToList(); 

這是更快,因爲過濾在爲

return GetAllProducts().Where(m => Equals(m.discounted, 1)).ToList(); 

篩選將在客戶端的內存中完成數據庫完成的。基本上,針對IQueriable接口發佈的LINQ語句將在提供程序是某個關係數據庫時轉換爲SQL。

但是,如果您使用帶有IEnumerable接口的LINQ,則查詢將在內存中執行。

4

LINQ的使用STR並且延遲執行,直到ToList()被調用,您的查詢尚未在數據庫上下文中執行。

(你應該知道你正在使用LINQ到實體這裏,所以你的LINQ由到一個SQL查詢,然後執行)

GetAllProducts()電話ToList()

此時SQL被髮送到您的數據庫,執行,然後它返回內存對象。這些內存中的對象,然後由這部分過濾: .Where(m => Equals(m.discounted, 1)).ToList();
(這部分現在LINQ到對象)

這是一個巨大障礙,因爲它會執行SQL查詢返回所有產品(=>SELECT * FROM PRODUCTS)。如果你有一百萬種產品,他們全都會回憶起來!

我推薦HRH Jon Skeets Edulinq series,它應該讓你很好地理解延遲執行。尤其是article on.Where();

+0

哎呀哎呀。我沒有看到! – gideon 2012-02-13 09:21:16

+0

謝謝@AakashM我更新了答案。 – gideon 2012-02-13 09:27:07