Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何在Linq查询中执行If语句_Asp.net Mvc_Linq_.net 3.5_C# 3.0_Linq To Objects - Fatal编程技术网

Asp.net mvc 如何在Linq查询中执行If语句

Asp.net mvc 如何在Linq查询中执行If语句,asp.net-mvc,linq,.net-3.5,c#-3.0,linq-to-objects,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,如果它不产生结果,则查询区域,然后查

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

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

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

你不是在找
操作员吗?这不会产生您想要的结果吗

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

阅读起来不是很容易,但您可以通过以下方式在一次过程中完成:

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

将null替换为默认值(int),如çağdaş所示,似乎达到了我的预期效果。那么where语句是否表示如果它不返回任何结果,请按我的想法尝试AreaStr?有了这一点,我猜我可以轻松地添加更多内容:我们假设区域字符串永远不会与区域字符串匹配,因此where将返回区域匹配的列表项或区域匹配的列表项。然后在选择中,我们再次检查匹配是区域还是区域。我将用一个更容易阅读的版本来编辑。我对这个林克云雀所能达到的效果印象深刻。真他妈甜。谢谢你的帮助!