我正在尝试编写一个检查三个字段的Linq查询:StateCode
,ChannelCode
和ZipCode
。
我想检查状态和频道代码的完全匹配。但是,如果数据库中的记录恰好为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();**
答案 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)
)