我目前有一个包含以下内容的列表
CountryCode (string)
CountryStr (string)
RegionStr (string)
RegionID (int)
AreaStr (string)
AreaID (int)
这是一组扁平的链接数据(所以基本上是已存储的联合搜索的结果)
MVC路由只传递一个字符串,然后我需要匹配到heirachy中正确级别的数据。 所以我试图查询CountryStr然后它是否产生区域然后区域的结果;但我需要做一点查询,例如......
var datURL = (from xs in myList
//query 1
where xs.RegionStr == rarREF
select new
{
regionID = xs.RegionId,
CountryID = xs.CountryCd
}
//IF theres no results
where xs.AreaStr == rarREF
select new
{
AreaID = xs.AreaID
regionID = xs.RegionId,
CountryID = xs.CountryCd
}
).ToList();
我目前看到的唯一方法是分别运行每个查询,然后检查返回的值并使用该值。我希望有一种更聪明,更清洁的方法。
答案 0 :(得分:4)
阅读起来并不容易,但你可以使用以下内容一次性完成:
var datURL = (from xs in myList
where xs.RegionStr == rarREF || xs.AreaStr == rarREF
select new
{
AreaID = (xs.AreaStr == rarRef ? xs.AreaID : default(int)),
RegionID = xs.RegionId,
CountryID = xs.CountryId
}
).ToList();
如果稍微重写了查询,也可能更容易阅读:
var datURL = (from xs in myList
let isArea = xs.AreaStr == rarREF
let isRegion = xs.RegionStr == rarREF
where isRegion || isArea
select new
{
AreaID = (isArea ? (int?)xs.AreaID : null),
RegionID = xs.RegionId,
CountryID = xs.CountryId
}
).ToList();
如果我们保存比较结果,我们可以在以后重复使用它。我还向int?
添加了一个强制转换,以显示如何使用可空值而不是使用0作为“无区域”值。
答案 1 :(得分:1)
您不是在寻找or
运营商吗?这不会产生你想要的结果吗?
var datURL = (from xs in myList
where xs.RegionStr == rarREF || xs.AreaStr == rarREF
select new
{
AreaID = xs.AreaStr == rarREF ? xs.AreaID : default(int)
regionID = xs.RegionId,
CountryID = xs.CountryCd
}).ToList();