2012-05-01 62 views
1

我有一個屬性OnHomePage這是一個布爾值。從linq查詢解析bool查詢

我想根據是否從linq查詢返回結果來設置此值。很明顯,我可以編寫一個外部方法來確定我的查詢結果是否爲null或者它是否包含值,但我希望有一個更好的方法可以在一行中完成。

這裏是我當前的代碼行,因爲它代表:

OnHomePage = im.PageImages.Select(p => p.ImageId == im.Id 
             && p.Page.PageName == "/Home") 
+1

大家沒有想到回答,你的布爾應該返回true,如果至少有一個是真的,或者所有的....? –

+1

@RoyiNamir:我認爲這不公平。爲我自己說話,我確實留意*「是否從linq查詢返回結果。」*這是'Any'。 – Jon

+0

@jon我的壞。沒有看到(除非快速編輯...) –

回答

4

您可以使用Any Extension Method,以確定是否查詢給出任何結果或不:

OnHomePage = im.PageImages.Any(p => p.ImageId == im.Id 
            && p.Page.PageName == "/Home"); 
+0

「Any」特別適合這種情況,因爲它短路,並且在找到匹配項時將停止迭代項目。 – bryanbcook

+2

@bryanbcook:所以'.Where(..)。Any()'。 '.Any(..)'可能會導致更高效的SQL轉換,具體取決於LINQ提供程序。 – dtb

+2

@bryanbcook這可能是一個IQueryable,而不是Enumerable,因此完全取決於查詢提供者。 – Servy

3

您應該簡單地包裹查詢與.Any

OnHomePage = im.PageImages.Where(p => p.ImageId == im.Id 
            && p.Page.PageName == "/Home") 
          .Any(); 

或者,只是使用的Any其他超載直接在第一名:

OnHomePage = im.PageImages.Any(p => p.ImageId == im.Id 
            && p.Page.PageName == "/Home"); 
+2

需要在第一個查詢中將「選擇」更改爲「Where」。第二個查詢很好。 – Servy

+0

@Servy:複製/粘貼錯誤。謝謝! – Jon

2
OnHomePage = im.PageImages.Where(p => p.ImageId == 
    im.Id && p.Page.PageName == "/Home").Any(); 
0

至於說其他用戶可以使用Any()

OnHomePage = im.PageImages.Any(p => p.ImageId == im.Id 
             && p.Page.PageName == "/Home"); 

或者另一種解決辦法可能是使用Exists()

OnHomePage = im.PageImages.ToList().Exists(p => p.ImageId == im.Id 
              && p.Page.PageName == "/Home"); 

Here是一個有趣的答案解釋的差異。

PS:

在行爲,這些是相同的。