来自列表的Linq查询包含检查空条件

时间:2014-01-07 17:49:05

标签: c# sql .net linq

我正在尝试使用Linq查询来搜索巨型列表中的匹配项(大约10万项)。搜索条件必须是字段StateCodeChannelCodeEndDateZipCode

但是,检查ZipCode有点棘手。我需要在这两个条件中给出结果:

  • 如果StateCodeChannelCodeEndDate匹配,则列表中的匹配记录的null值为ZipCode
  • 如果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();

3 个答案:

答案 0 :(得分:1)

应该是;

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

答案 1 :(得分:0)

你的意思是这里只有一个管道符号吗?两个管道(||)是逻辑的,单个是按位或

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

答案 2 :(得分:0)

由于数据库中的ZipCode字段长度为9位,因此Linq在每个5位邮政编码的末尾放置了四个空格。因此,邮政编码'00001'的值为'00001'。通过放置.Trim(),我现在能够获得预期的结果。

(string.IsNullOrWhiteSpace(z.ZipCode) || z.ZipCode.Trim().Equals(item.ZipCode)
相关问题