【发布时间】:2014-01-07 17:49:05
【问题描述】:
我正在尝试使用 Linq 查询在一个巨大的列表(大约 10 万个项目)中搜索匹配项。搜索条件必须是字段StateCode、ChannelCode、EndDate 和ZipCode。
但是,ZipCode 的检查有点棘手。鉴于以下两种情况之一,我需要撤回结果:
- 如果
StateCode、ChannelCode和EndDate是匹配项,并且列表中的匹配记录具有null的ZipCode值。 - 如果
StateCode、ChannelCode、EndDate和ZipCode匹配,则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 的列表(在上面的帖子中提到)
-
作为注释,我认为 | 的运算符优先级出现在 && 之前(它本身在 || 之前),所以 |和 ||不能严格互换。