2010-06-03 54 views
3

我們可以使用foreach循環來查詢Iqueryable對象嗎?對於可查詢對象的Foreach循環問題

我想要做的事情如下:

query = Iqueryable<Myclass> = objDataContext.Myclass; // objDataContext is an object of LINQ datacontext class 

int[] arr1 = new int[] { 3, 4, 5 }; 

foreach (int i in arr1) 
{ 
query = query.Where(q => (q.f_id1 == i || q.f_id2 == i || q.f_id3 == i)); 
} 

它給了我錯誤的輸出作爲每個時間值,如果我改變。

+3

什麼「輸出」?這裏沒有輸出... – 2010-06-03 05:51:16

回答

3

你面臨的問題是延遲執行,你應該能夠找到很多這方面的信息,但基本上沒有任何代碼正在執行,直到你真正嘗試從IQueryable讀取數據(將其轉換爲IEnumerable或List或其他類似的操作)。這意味着這一切都發生在foreach完成後,當我設置爲最終值時。

如果我沒有記錯的一件事,你可以做的是初始化裏面的一個新的變量for循環是這樣的:

foreach (int i in arr1) 
{ 
    int tmp = i; 
    query = query.Where(q => (q.f_id1 == tmp || q.f_id2 == tmp || q.f_id3 == tmp)); 
} 

,將其置於其重新創建的每個循環中,變量應的新變量在執行IQueryable之前不得更改。

1

你不需要一個爲每個,嘗試這樣的:

query = objDataContext.Myclass.Where(q => (arr1.Contains(q.f_id1) || arr1.Contains(q.f_id2) || arr1.Contains(q.f_id3)); 
+0

從邏輯上講,它會給出不正確的過濾器,嘗試在SQL中運行該查詢! – Vikas 2010-06-03 06:03:25

+1

看到這兩個查詢是不同的: SELECT * FROM MyClass的,其中(f_id1 = 1或f_id2 = 1或f_id3 = 1) 和(f_id1 = 3或f_id2 = 3或f_id3 = 3); select * from MyClass where(f_id1 in(1,3)or f_id2 in(1,3)or f_id3 in(1,3)) – Vikas 2010-06-03 06:07:30

+0

您是對的,對不起,我誤解了邏輯 – alejandrobog 2010-06-03 06:14:53

0

這是因爲「i」不計算,直到你真正使用迭代查詢collectionif不是那個時候我相信「i」將是最後一個。