Linq查询条件为多行

时间:2014-03-12 14:04:33

标签: database linq linq-to-entities

我尝试解决过去2天的一个查询,但没有。 它看起来很容易理解,但无法制作。

表中有两列例如:

ResourceId  ||   MappingId

      1            2
      1            3
      2            2
      2            4
      3            2
      3            4
      4            2
      4            5
      5            2
      5            4

这是一个包含两个字段ResourceId和MappingId的表。 现在我想要具有Mappingid {2,4}

的resourceId

表示答案必须为ResourceId {2,3,5}

如何在Linq Query中获得此答案?

2 个答案:

答案 0 :(得分:2)

使用Contains集合。此方法可以由Entity Framework转换为SQL IN运算符:

int[] mappingIds = { 2, 4 };
var resources = from t in table
                where mappingIds.Contains(t.MappingId)
                select t.ResourceId;

Lambda语法:

var  resources = table.Where(t => mappingIds.Contains(t.MappingId))
                      .Select(t => t.ResourceId);

生成的SQL将如下所示:

SELECT [Extent1].[ResourceId]
FROM [dbo].[TableName] AS [Extent1]
WHERE [Extent1].[MappingId] IN (2,4)

更新:如果你想获得所有提供映射ID的资源,那么

var resources = from t in table
                group t by t.ResourceId into g
                where mappingIds.All(id => g.Any(t => t.Id == id))
                select g.Key;

实体框架能够将此查询转换为SQL,但它不会像上面的查询那样漂亮。

答案 1 :(得分:1)

IQueryable<int> resourceIds = table
     // groups items by ResourceId
     .GroupBy(item => item.ResourceId)
     // consider only group where: an item has 2 as MappingId value
     .Where(group => group.Select(item => item.MappingId).Contains(2))
     // AND where: an item has 4 as MappingId value
     .Where(group => group.Select(item => item.MappingId).Contains(4))
     // select Key (= ResourceId) of filtered groups
     .Select(group => group.Key);