2013-03-07 181 views
1

我想這是一個非常標準的任務,但我仍然無法習慣於LINQ。我需要從表中正好有兩個排在我的數據庫,現在我使用兩個單獨的LINQ查詢:從數據庫表中選擇兩行

 imageInfo = AppConfigService.All().Where(a =>(a.ConfigProperty == "MaterialImages")).FirstOrDefault(); 
     imageLocation = AppConfigService.All().Where(c => (c.ConfigProperty == "DefaultImagePath")).FirstOrDefault(); 

我要的是一個變量來保存信息,像imageInfo[0]爲我MaterialImagesimageInfo[1]DefaultImagePath或類似的東西。儘管我對LINQ的知識很差,但我認爲這兩個查詢是不需要的。

+1

要小心「全部」調用:如果這是一個數據庫調用而不是'IQueryable'對象,則會得到所有行,然後在內存中過濾,這很可能不是您想要的。 – 2013-03-07 13:30:01

回答

4

您可以使用ConcatTake(1)

var imageInfoLocation = 
    (from a in AppConfigService 
    where a.ConfigProperty == "MaterialImages" 
    select cust).Take(1) 
    .Concat(
    (from a in AppConfigService 
    where a.ConfigProperty == "DefaultImagePath" 
    select cust).Take(1)) 
; 
+0

謝謝你的答案,我會用你的,所以我會接受它。 – Leron 2013-03-07 13:37:35

+0

謝謝,我已經注意到了,但即使我喜歡'dasblinkenlight'也可以更容易理解你的代碼。 – Leron 2013-03-07 13:52:37

-1

您可以使用以下

var rows = AppConfigService.All().Where(a =>(a.ConfigProperty == "MaterialImages" || c.ConfigProperty == "DefaultImagePath")); 
+0

'c'從哪裏來? – dasblinkenlight 2013-03-07 13:22:07

+0

這是不正確的。你沒有定義'c',即使這樣也沒有意義。 – Jobo 2013-03-07 13:22:11

+0

傢伙很明顯..這是一個錯字,請考慮。 – spajce 2013-03-07 13:23:39

3

您可以在下面用一個單一的查詢,但你的原始查詢更具可讀性:

var res = AppConfigService 
    .All() 
    .Where(a =>(a.ConfigProperty == "MaterialImages" || a.ConfigProperty == "DefaultImagePath")) 
    .GroupBy(a => a.ConfigProperty) 
    .ToDictionary(g => g.Key, g => g.FirstOrDefault()); 

這將帶回一個不超過兩個項目的字典:一個爲ConfigProperty,一個用於具有該屬性的第一個或默認項目。如果沒有使用"MaterialImages""DefaultImagePath"的源行,結果將包含少於兩個項目。您可以使用相應的常量作爲關鍵字查找字典中的值。

1

,我認爲它不可能,只要你想第一個元素形成滿足兩個不同的條件列表在一個查詢做,你可以利用工會的,如果你想造成一個集

var union = imageInfo = AppConfigService.All(). 
    Where(a =>(a.ConfigProperty == "MaterialImages")).FirstOrDefault(). 
    Union(
      AppConfigService.All().Where(c => (c.ConfigProperty == 
             "DefaultImagePath")).FirstOrDefault());