2013-03-07 155 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());