我正在尝试使用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 :(得分: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)