如果Linq查询为空或匹配特定值,则查询该字段

时间:2013-11-21 18:27:10

标签: .net linq

我正在尝试编写一个检查三个字段的Linq查询:StateCodeChannelCodeZipCode

我想检查状态和频道代码的完全匹配。但是,如果数据库中的记录恰好为null,那么我想拉出该记录。如果它不为null,我想仅在邮政编码匹配值时才提取它。我尝试用不同的方式写这个,每个都不断失败。这是我最近的尝试:

var similarZips = (from z in _db.ZipCodeTerritory
                    where z.StateCode.Equals(zipCode.StateCode) &&
                            z.ChannelCode.Equals(zipCode.ChannelCode)
                    select z).Where(x => x.Id != zipCode.Id && 
                            (x.ZipCode.Equals(null) || x.ZipCode.Equals(zipCode.ZipCode))).ToList();

我也给了这个镜头并收到了相同的结果

var similarZips = (from z in _db.ZipCodeTerritory
                    where z.StateCode.Equals(zipCode.StateCode) &&
                            z.ChannelCode.Equals(zipCode.ChannelCode) &&
                            (z.ZipCode.Equals(null) ? z.ZipCode.Equals(null) : z.ZipCode.Equals(zipCode.ZipCode))
                    select z).Where(x => x.Id != zipCode.Id).ToList();

修改

此处发生的问题仅在zipCode.ZipCode值为NULL时发生。在这种情况下,这个陈述是多余的x.ZipCode.Equals(null) || x.ZipCode.Equals(zipCode.ZipCode) - 我基本上要求它检查null.Equal(null)的内容。

我需要重新编写类似于下面的查询。然而,我遇到的问题现在是三元声明的第一部分。如果zipCode.Zipcode值为null,那么我只想获取具有匹配状态和通道代码组合的所有记录(任何zip都可以)。但是,如果定义了zip,那么我只想使用匹配的邮政编码或空邮政编码来获取状态/通道组合。如果zipCode.ZipCode值为null,我就停留在那里,我告诉查询抓取所有记录。

 var similarZips = (from z in _db.ZipCodeTerritory
                    where z.StateCode.Equals(zipCode.StateCode) &&
                            z.ChannelCode.Equals(zipCode.ChannelCode) && 
                            (zipCode.ZipCode.Equals(null) ? 
                                    <any zip will do> : 
                                (z.ZipCode.Equals(zipCode.ZipCode) || z.ZipCode.Equals(null)))
                    select z).Where(x => x.Id != zipCode.Id).ToList();**

3 个答案:

答案 0 :(得分:0)

你不能只使用两个查询吗?

List<ZipCodeTerritory> similarZips;

if (zipCode.ZipCode != null)
{
  similarZips = (from z in _db.ZipCodeTerritory
                 where z.StateCode.Equals(zipCode.StateCode) &&
                       z.ChannelCode.Equals(zipCode.ChannelCode) &&
                       z.ZipCode.Equals(zipCode.ZipCode)).ToList(); 
}
else
{
  similarZips = (from z in _db.ZipCodeTerritory
                 where z.StateCode.Equals(zipCode.StateCode) &&
                       z.ChannelCode.Equals(zipCode.ChannelCode).ToList(); 

}

答案 1 :(得分:0)

因为我猜Linq没有“all”的关键字,所以我必须像这样编写查询

var similarZips = (from z in _db.ZipCodeTerritory
                    where (zipCode.ZipCode.Equals(null) ?
                            z.StateCode.Equals(zipCode.StateCode) &&
                            z.ChannelCode.Equals(zipCode.ChannelCode) :
                            z.StateCode.Equals(zipCode.StateCode) &&
                            z.ChannelCode.Equals(zipCode.ChannelCode) &&
                            (z.ZipCode.Equals(zipcodeterritory.ZipCode) || z.ZipCode.Equals(null)))
                    select z).Where(x => x.Id != zipCode.Id).ToList();

答案 2 :(得分:0)

 1      z.StateCode.Equals(zipCode.StateCode)
 2   && z.ChannelCode.Equals(zipCode.ChannelCode)
 3   && (
 4          (zipCode.ZipCode.Equals(null))
 5       ||
 6          (
 7              (!zipCode.ZipCode.Equals(null))
 8           &&
 9              (
10                  z.ZipCode.Equals(null)
11               ||
12                  z.ZipCode.Equals(zipCode.ZipCode)
13              )
14          )
15      )

(1)匹配状态(2)和通道(3)和(4)没有指定的邮政编码(5)或(7)有指定的邮政编码(8)和(10)邮政编码记录的空白(11)或(12)与指定的邮政编码匹配。

您可以很容易地看到第7行是多余的,整个过程可以简化为以下内容。

   z.StateCode.Equals(zipCode.StateCode)
&& z.ChannelCode.Equals(zipCode.ChannelCode)
&& (
        zipCode.ZipCode.Equals(null)
     || z.ZipCode.Equals(null)
     || z.ZipCode.Equals(zipCode.ZipCode)
   )