我試圖寫一個Linq查詢,檢查三個字段:StateCode
,ChannelCode
和ZipCode
。Linq查詢來拾取字段,如果它爲空或匹配特定值
我想檢查狀態和渠道代碼的完全匹配。但是,如果數據庫中的記錄恰好爲空,那麼我想要取出該記錄。如果它不爲空,我想只在郵政編碼匹配一個值時才提取它。我試圖用幾種不同的方式來寫這篇文章,每篇文章都失敗了。這是我最近一次嘗試:
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.ZipCode
值NULL
發生。在這種情況下,這種說法是多餘的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();**
這似乎錯誤地處理第一種情況 - 如果一個郵政編碼指定只記錄與匹配郵政編碼檢索但省略了空郵政編碼的記錄,而他們應該,如果我理解正確的問題被列入。 –