如何在Linq Query中执行语句

时间:2009-07-20 13:11:26

标签: asp.net-mvc linq .net-3.5 c#-3.0 linq-to-objects

我目前有一个包含以下内容的列表

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();

我目前看到的唯一方法是分别运行每个查询,然后检查返回的值并使用该值。我希望有一种更聪明,更清洁的方法。

2 个答案:

答案 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();