2014-02-11 40 views
1

查詢1爲什麼2個LINQ查詢得到評估不同

 var resulty = db.QIS 
      .Where(w=>w.QSA.Any(a => a.QSID != w.QSID)) 
      .Select(s => s.QSID).ToList(); 

查詢2

 var resultz = db.QIS 
      .Where(w=>w.QSA.Where(h => h.QSID == w.QSID).Select(s => s.QSID).FirstOrDefault() != w.QSID) 
      .Select(s => s.QSID).ToList(); 

QISQSA相關Many:Many。這裏的想法是找到QIS.ID's有多少QSAQIS.QID == QSA.QID

Query 1回報0

Query 2,從另一方面給了我什麼,我希望看到(列表中關閉所有非匹配QIS記錄)。

爲什麼會在任何不行? - 我發現自己在單獨的場景中幾次遇到同樣的情況......感謝任何幫助/想法。

PS:首選方法語法。

+3

'Any()'返回一個布爾值,而不是'IEnumerable'。無論如何,這兩個查詢都沒有多大意義。 'db.QIS'和'w.QSA'之間發生了什麼?好像有一個點在那裏丟失。另外,你的第一個查詢有一個太多的小括號。你爲什麼不復制/粘貼你的實際工作代碼? –

+0

對不起,我試圖在發佈之前弄清楚所有的怪癖,再看看,當我將!=轉成==(在。任何比較)時,我都會得到我想要的相反值。從邏輯上講,我認爲我可以放置一個!=來獲得我需要的東西。 –

+0

你在第二個查詢中雙擊'where'會讓我困惑。那是幹什麼的?另外,這似乎是在編寫SQL時使用「內部連接」的超級小問題... –

回答

4

在您的第二版本的濾波,如果內Where子句返回沒有元素,只會是真實的,使得FirstOrDefault()返回null0(取決於如果類型是可空的或沒有)。

w=>w.QSA.Where(h => h.QSID == w.QSID) 
.Select(s => s.QSID).FirstOrDefault() != w.QSID 

即相當於(現在假設QSID是一個非可空數字類型,如果是空的,使用的null代替零):

w=>w.QSA.Where(h => h.QSID == w.QSID) 
.Select(s => s.QSID).FirstOrDefault() == 0 

可重寫爲:

w=>w.QSA.Where(h => h.QSID == w.QSID).FirstOrDefault() == null 

可以改寫爲:

w=>!w.QSA.Any(h => h.QSID == w.QSID) 

這與您的初始版本幾乎相同,但不完全相同。您仍想檢查內部的Any()過濾器的等效性,但是會否定結果。

+0

感謝您花時間回答問題,從未想過在開始時否定Any()過濾器。謝謝! –

相關問題