2012-06-08 113 views
1

我試圖找到包含從數據庫歌廳他們之後的短語中所有單詞的所有元素:在LINQ奇怪的行爲爲sql

string text = "ab cd 23";//the element prop2 must have all 3 word regardless their order 
var q = from c in db.myTable 
where c.Prop1 == "value" 
select c; 
string[] strings = text.Split(' '); 
foreach(string word in strings) 
{ 
     int cnt = q.Count();//first time cnt = 1500 which is correct 
     q = q.Where(c => c.Prop2.Contains(word));// Prop2 is a string 
     cnt = q.Count();//first time cnt = 460 
} 

一切正常,直到這樣的:

foreach(string word in strings)// second time 
{ 
     int cnt = q.Count();//second time cnt = 14 ?? 
     q = q.Where(c => c.Prop2.Contains(word)); 
     cnt = q.Count();//first time cnt = 2 
} 

在第二個循環中沒有做任何事情元素計數變化 此外,這應該只返回具有所有單詞的元素,但它返回的元素只有最後一個 和第三個循環沒用沒有變化

對不起,我很長Q,但我是新來的LINQ

回答

3

我認爲這可能是可怕的「修改關閉」錯誤。創建word循環變量的臨時副本,並在查詢中使用它。

foreach(string word in strings) { 
    var tmp = word; 
    int cnt = q.Count(); 
    q = q.Where(c => c.Prop2.Contains(tmp)); 
    cnt = q.Count();//first time cnt = 460 
} 

您應該避免使用LINQ中表達循環變量,除非你「兌現」他們馬上(即調用ToList()ToArrayFirst()SingleOrDefault等),當您需要使用您的循環變量的值,做一個臨時副本。原因是LINQ推遲執行查詢,所以當查詢得到執行時,循環變量的值發生了變化,結果將會意外更改。

+0

很快:D謝謝! – Star