【问题标题】:Linq query from list containing check for null condition来自列表的 Linq 查询,包含对空条件的检查
【发布时间】:2014-01-07 17:49:05
【问题描述】:

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

但是,ZipCode 的检查有点棘手。鉴于以下两种情况之一,我需要撤回结果:

  • 如果StateCodeChannelCodeEndDate 是匹配项,并且列表中的匹配记录具有nullZipCode 值。
  • 如果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 的列表(在上面的帖子中提到)
  • 作为注释,我认为 | 的运算符优先级出现在 && 之前(它本身在 || 之前),所以 |和 ||不能严格互换。

标签: c# sql .net linq


【解决方案1】:

应该是的;

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

【讨论】:

  • 还是没有运气。通过运行 SQL 查询进行双重检查。
  • @NealR 这是一个 Linq2SQL 查询吗?如果是,请检查生成的 SQL 代码。
  • LINQ to Entities 我相信
  • @NealR 调试代码并确保item 属性具有正确的值。例如,当您使用 linq to objects 时,字符串比较区分大小写。
【解决方案2】:

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

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

【讨论】:

  • 运算符 | 在调用两个布尔值时不是按位 OR,而是非短路 OR。
  • 这只是我最近的尝试,无论如何都行不通。我会更新帖子。谢谢
【解决方案3】:

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

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

【讨论】:

  • 如果字段是char(9),实际上是数据库设置了空格而不是linq。但是数据库中的 equals 忽略尾随空格,C# 不会。 Varchar(9) 在这种情况下会更合适。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
相关资源
最近更新 更多