【问题标题】:How to do If statement in Linq Query如何在 Linq Query 中执行 If 语句
【发布时间】:2010-11-12 07:33:06
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    阅读起来并不容易,但您可以使用类似这样的方式一次性完成:

    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 作为“无区域”值。

    【讨论】:

    • 在 çağdaş 中将 null 替换为 default(int) 似乎有点像 Id 期望的那样。那么 where 语句是说如果它没有返回任何结果,请按照我的想法尝试 AreaStr 吗?有了这个,我猜我可以很容易地添加更多:op
    • 我们假设 Region 字符串永远不会匹配 Area 字符串,因此 where 将返回 Region 匹配或 Area 匹配的列表项。然后在选择中,我们再次检查匹配是区域还是区域。我将使用可能更易于阅读的版本进行编辑。
    • 我对这个 linq 百灵鸟所能取得的成就印象深刻。非常甜蜜。感谢您的帮助!
    【解决方案2】:

    您不是在寻找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();
    

    【讨论】:

      猜你喜欢
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      相关资源
      最近更新 更多