2009-07-20 51 views
3

我现在有一个包含列表如下怎么办如果声明LINQ查询

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

我看到目前这样做的唯一方法是单独运行的每个查询,然后检查其返回值,并使用一个。我希望有一个更聪明,更清洁的方法。

回答

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

+0

默认(int)交换空如在çağdaş似乎有点做id预期。那么是哪里的声明说,如果它返回没有结果尝试AreaStr,因为我认为它是?我猜测我可以轻松地按照自己的方式添加更多内容:op – 2009-07-20 13:42:55

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