2013-11-21 17 views
0

我試圖寫一個Linq查詢,檢查三個字段:StateCodeChannelCodeZipCodeLinq查詢來拾取字段,如果它爲空或匹配特定值

我想檢查狀態和渠道代碼的完全匹配。但是,如果數據庫中的記錄恰好爲空,那麼我想要取出該記錄。如果它不爲空,我想只在郵政編碼匹配一個值時才提取它。我試圖用幾種不同的方式來寫這篇文章,每篇文章都失敗了。這是我最近一次嘗試:

var similarZips = (from z in _db.ZipCodeTerritory 
        where z.StateCode.Equals(zipCode.StateCode) && 
          z.ChannelCode.Equals(zipCode.ChannelCode) 
        select z).Where(x => x.Id != zipCode.Id && 
          (x.ZipCode.Equals(null) || x.ZipCode.Equals(zipCode.ZipCode))).ToList(); 

我也給這個一杆,並獲得相同的結果

var similarZips = (from z in _db.ZipCodeTerritory 
        where z.StateCode.Equals(zipCode.StateCode) && 
          z.ChannelCode.Equals(zipCode.ChannelCode) && 
          (z.ZipCode.Equals(null) ? z.ZipCode.Equals(null) : z.ZipCode.Equals(zipCode.ZipCode)) 
        select z).Where(x => x.Id != zipCode.Id).ToList(); 

編輯

這裏發生的問題,只有當zipCode.ZipCodeNULL發生。在這種情況下,這種說法是多餘的x.ZipCode.Equals(null) || x.ZipCode.Equals(zipCode.ZipCode) - 我基本上要求它檢查null.Equal(null)

我需要重新編寫類似於下面的查詢。但是,我現在遇到的問題現在是三元聲明的第一部分。如果zipCode.Zipcode的值爲空,那麼我只需要獲取匹配狀態和頻道代碼組合的所有記錄(任何zip都可以)。但是,如果定義了zip,那麼我只想要使用匹配的郵政編碼或空的郵政編碼來獲取狀態/頻道組合。如果zipCode.ZipCode的值是null,我就會被卡住,我告訴查詢抓取所有記錄。

var similarZips = (from z in _db.ZipCodeTerritory 
        where z.StateCode.Equals(zipCode.StateCode) && 
          z.ChannelCode.Equals(zipCode.ChannelCode) && 
          (zipCode.ZipCode.Equals(null) ? 
            <any zip will do> : 
           (z.ZipCode.Equals(zipCode.ZipCode) || z.ZipCode.Equals(null))) 
        select z).Where(x => x.Id != zipCode.Id).ToList();** 

回答

0

你不能只使用兩個查詢嗎?

List<ZipCodeTerritory> similarZips; 

if (zipCode.ZipCode != null) 
{ 
    similarZips = (from z in _db.ZipCodeTerritory 
       where z.StateCode.Equals(zipCode.StateCode) && 
         z.ChannelCode.Equals(zipCode.ChannelCode) && 
         z.ZipCode.Equals(zipCode.ZipCode)).ToList(); 
} 
else 
{ 
    similarZips = (from z in _db.ZipCodeTerritory 
       where z.StateCode.Equals(zipCode.StateCode) && 
         z.ChannelCode.Equals(zipCode.ChannelCode).ToList(); 

} 
+0

這似乎錯誤地處理第一種情況 - 如果一個郵政編碼指定只記錄與匹配郵政編碼檢索但省略了空郵政編碼的記錄,而他們應該,如果我理解正確的問題被列入。 –

0

因爲我想LINQ的沒有一個關鍵字爲 「所有」,我不得不寫這樣

var similarZips = (from z in _db.ZipCodeTerritory 
        where (zipCode.ZipCode.Equals(null) ? 
          z.StateCode.Equals(zipCode.StateCode) && 
          z.ChannelCode.Equals(zipCode.ChannelCode) : 
          z.StateCode.Equals(zipCode.StateCode) && 
          z.ChannelCode.Equals(zipCode.ChannelCode) && 
          (z.ZipCode.Equals(zipcodeterritory.ZipCode) || z.ZipCode.Equals(null))) 
        select z).Where(x => x.Id != zipCode.Id).ToList(); 
查詢
0
1  z.StateCode.Equals(zipCode.StateCode) 
2 && z.ChannelCode.Equals(zipCode.ChannelCode) 
3 && (
4   (zipCode.ZipCode.Equals(null)) 
5  || 
6   (
7    (!zipCode.ZipCode.Equals(null)) 
8   && 
9    (
10     z.ZipCode.Equals(null) 
11    || 
12     z.ZipCode.Equals(zipCode.ZipCode) 
13    ) 
14   ) 
15  ) 

(1)匹配的狀態(2)和信道( (5)或(7)指定的郵政編碼(8)和(10)該記錄的郵政編碼爲空(11)或(12)與指定的郵政編碼。

正如你可以很容易地看到第7行是多餘的,整個事情可以減少到以下。

z.StateCode.Equals(zipCode.StateCode) 
&& z.ChannelCode.Equals(zipCode.ChannelCode) 
&& (
     zipCode.ZipCode.Equals(null) 
    || z.ZipCode.Equals(null) 
    || z.ZipCode.Equals(zipCode.ZipCode) 
    ) 
相關問題