我尝试解决过去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中获得此答案?
答案 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);