2012-05-23 57 views
0

我一直在努力掙扎,並試圖讓我的思維圍繞這些概念。任何幫助將不勝感激。給定一個表中的Orders集合,迭代它的最好方法是什麼,並對其他表執行查詢。如何在不使用foreach的情況下從集合中查詢實體

這個循環做我想要的,但我已經被告知並顯示這是如何導致性能問題。在其他帖子上,我已經閱讀了最好在循環之外查詢dbase的位置。

foreach (var item in myOrders) 
{ 
var lookUpValues=(from f in ORDERS 
where f.ORDERS ==item.ORDER_ID 
&& f.ORDERS_SUFFIX==item.LINE 
select f.Something); 
} 

而不是下拉到遍歷我已經試過這樣的事情,但是當你看到它不會返回準確的行之前的整個訂單表。

var orderIds=myOrders.Select (x =>x.ORDER_ID).Distinct().ToList(); 
var lineIds=myOrders.Select (x =>x.LINE).Distinct().ToList(); 

var query=(from f in ORDERS 
where orderIds.Contains(f.ORDERS) 
&& lineIds.Contains(f.ORDERS_SUFFIX) 
select f).ToList(); 

下面會做我認爲需要的。它會返回迭代所需的正確訂單。但是,它會拋出一個錯誤,我相信這是因爲你無法一起查詢內存對象和實體。

var ordersAndLine=(from f in myOrders select new{sId=f.ORDER_ID,line=f.LINE}).ToList(); 

var query=(from f in ORDERS 
from s in ordersAndLine 
where s.sId==f.ORDERS 
&& s.line==f.ORDERS_SUFFIX 
select f).ToList(); 

NotSupportedException:無法創建類型爲「匿名類型」的常量值。在此上下文中僅支持基本類型(如Int32,String和Guid)。

我真的希望我的問題有道理。如果我沒有正確解釋我的情況,我會提前道歉。我一直在做的是將表的大部分內存拉到內存中迭代,但我擔心這會導致性能問題,並希望看看是否有更好的方法來過濾結果查詢。

+1

myOrders和ORDERS從哪裏來。它們是來自數據上下文的屬性嗎?他們是你已經拉回來的藏品嗎?我猜ORDERS是數據上下文的一個屬性,myOrders是前一個查詢的結果,但不容易分辨。此外,如果myOrders(或訂單)是查詢的結果,它仍然是IQueryable,還是您稱爲ToArray或ToList? – Devin

+0

嗨德文。訂單是一個表,myOrders是一個用戶定義的訂單子集,存在於臨時表中。 – Mustang31

回答

1

如果您結合您的第一次嘗試和你的最後一次嘗試,你會擁有它。如果您沒有創建匿名類型,最後一次嘗試會很好。

var ordersAndLine=(from f in myOrders select f).ToList(); 

var query=(from f in ORDERS 
from s in ordersAndLine 
where s.ORDER_ID==f.ORDERS 
&& s.LINE==f.ORDERS_SUFFIX 
select f).ToList(); 
+0

嗨柯克,我現在沒有在我面前的代碼。但我認爲它會拋出一個錯誤,因爲ORDERS是一個表實體,其中orderAndLine在內存中。上面顯示的錯誤消息。 – Mustang31

+0

我想我說的是你的話。給我幾分鐘試試這個。乾杯 – Mustang31

0

試試這個:

var orders = myOrders.SelectMany(item => (from f in ORDERS 
              where f.ORDERS ==item.ORDER_ID 
              && f.ORDERS_SUFFIX==item.LINE 
              select f.Something)); 
相關問題