2009-10-27 65 views
1

我對語法錯誤表示歉意,這是我對問題的簡單解釋。如何正確過濾子對象?

我已經設置了客戶和CustomerId訂單之間的關係我的dbml文件。 我試圖返回所有訂單少於10美元的客戶。

Customer customer = context.Customers.FirstOrDefault(c => c.Id == 123); 
IEnumerable<Order> orders = customer.Orders.Where(o => o.Total < 10); 

這需要永遠是因爲當命令被列舉,生成的SQL忽略where子句,翻出記錄1000,然後在內存中,篩選出基於where子句中的命令。

我該如何設置它,以便它會生成一個查詢來過濾服務器上的訂單?

回答

2

這將轉換成SQL您期望:

var qry = from o in context.Orders 
      where o.CustomerId == 123 
       && o.Total < 10 
      select o; 

(編輯)

看我的日誌,我可以看到你的代碼生成的SQL是我所預期的那樣好,過濾在SQL數據庫中完成。所以,訂單不是全部加載。您是否更改了數據上下文中的任何選項,如DeferredLoadingEnabled或提供了任何LoadOptions

+0

+1您會驚訝於從製作可高效轉換爲SQL的查詢中獲得的性能提升。 :) – leppie

+0

我完全同意。這很糟糕,因爲我在我的dbml中設置了所有這些關係,並且所有返回具有大量記錄的子項的內容都是毫無價值的,因爲我必須先將它們全部返回,然後才能對它們進行過濾。感謝您的意見。 –