2009-07-20 50 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();