2014-01-07 62 views
0

我想用一個Linq查詢來搜索巨大列表中的匹配項(大約100k項)。搜索標準需要是字段StateCodeChannelCodeEndDateZipCodeLinq查詢從包含檢查爲空條件的列表

然而,檢查ZipCode是有點棘手。我需要給拉了回來給出以下兩種情況的結果:

  • 如果StateCodeChannelCodeEndDate是一根火柴,然後在列表中的匹配記錄有ZipCode一個null值。
  • 如果StateCodeChannelCodeEndDateZipCode是一根火柴,用ZipCode是在這兩個列表,比較項目的定義值

這是因爲我有它現在查詢......這沒有按」工作。它不斷拉回一個列表,計數爲0。但是,如果我刪除搜索ZipCode匹配的部分,則會得到結果。

List<ZipCodeTerritory> previousZips = allRecords.Where(
     z => (z.StateCode.Equals(item.StateCode) && 
     z.ChannelCode.Equals(item.ChannelCode) && 
     z.EndDate.Date == item.EndDate.Date && 
     (z.ZipCode.Equals(null) | z.ZipCode.Equals(item.ZipCode)) 
    )).ToList(); 

我也曾嘗試更換z.ZipCode.Equals(null)string.IsNullOrWhiteSpace(z.ZipCode),這仍然沒有奏效。

編輯:我也嘗試了用條件和|作爲||or操作。兩者都不能...

爲了以防萬一,這裏是查詢寫入SQL語句。如果我在SQL Server Management Studio中運行它,它會按預期工作。

SELECT * FROM ZipCodeTerritory 
WHERE StateCode = 'OR ' and ChannelCode = 'G' and EndDate = '12/31/9999' and (ZipCode IS NULL OR ZipCode = '00001') 

第二個編輯

這是我如何抓住從數據庫中記錄。同樣,因爲我不想多次撥打電話,我想從ZipCodeTerritory表中獲取所有記錄,然後搜索該列表。

List<ZipCodeTerritory> allRecords = (from z in db.ZipCodeTerritory 
             select z).ToList(); 
+0

它不斷拉回一個計數爲0的列表(在上文中提到) – NealR

+0

就像一個筆記,我認爲,在&之前(它本身在||之前),所以|和||並非嚴格互換。 – JakeP

回答

0

你的意思是說在這裏只有一個管道符號?兩個管道(||)是邏輯或,單個是按位或

(z.ZipCode.Equals(null) | z.ZipCode.Equals(item.ZipCode)) 
+0

運算符'|'在兩個布爾值上調用時不是按位OR,它是一個非短路OR。 – Servy

+0

這只是我最近的嘗試,它不會以任何方式工作。我會更新帖子。謝謝 – NealR

1

它應該是;

(z.ZipCode == null || z.ZipCode.Equals(item.ZipCode)) 
+0

仍然沒有運氣。通過運行SQL查詢進行雙重檢查。 – NealR

+0

@NealR這是一個Linq2SQL查詢?如果是這樣,請檢查生成的SQL代碼。 – Magnus

+0

LINQ to Entities我相信 – NealR

0

由於在數據庫中的字段ZipCode爲9位長,LINQ的放置四個空間在每個5位郵政編碼的端部。因此,'00001'的郵政編碼將是'00001'的值。通過放置.Trim()這樣我現在可以得到預期的結果。

(string.IsNullOrWhiteSpace(z.ZipCode) || z.ZipCode.Trim().Equals(item.ZipCode) 
+1

如果該字段是「char(9)」,那它實際上是在那裏設置空格而不是linq的數據庫。但是數據庫中的equals會忽略尾隨空格,C#不會。在這種情況下,'Varchar(9)'會更合適。 – Magnus