Linq选择包含多个ID的组的行

时间:2015-10-27 11:22:36

标签: c# linq

我的列表折叠的数据如下所示:

ID  |  Name      | TypeId  | CategoryId  |  
-----------------------------------------
1   |  Rows1     | 10      | 1           |  
2   |  Rosw2     | 20      | 1           |  

3   |  Rosw3     | 30      | 2           |  
4   |  Rosw4     | 20      | 2           |  

5   |  Rosw5     | 10      | 3           |  
6   |  Rosw6     | 10      | 4           |

7   |  Rows7     | 10      | 1           |  
8   |  Rosw8     | 20      | 1           |  

我愿意 只获取具有TypeID 10和20的组(逻辑和条件) 而不是那些有不同元素的人。

我的理论结果是

ID  |  Name      | TypeId  | CategoryId  |  
-----------------------------------------
1   |  Rosw1     | 10      | 1           |  
2   |  Rosw2     | 20      | 1           |  
5   |  Rosw5     | 10      | 3           |  
6   |  Rosw6     | 10      | 4           |
7   |  Rows7     | 10      | 1           |  
8   |  Rosw8     | 20      | 1           |  

在我的软件项中,过滤甚至可以超过两个(10,20)。 它们可以是1到n。

我的群组由TypeID和CategoryId

组成

我在vs express上使用c#。

对不起我的英语。

2 个答案:

答案 0 :(得分:0)

您可以使用匿名类型按多个属性/列进行分组:

List<int> types = new List<int>{ 10, 20 };
var query = db.Table
    .Where(x => types.Contains(x.TypeId))
    .GroupBy(x =>  new{ x.TypeId, x.CategoryId })
    .Select(g => g.First());

答案 1 :(得分:0)

听起来你想要下载

List<int> types = new List<int>{ 10, 20 };
var query = db.Table
    .Where(x => types.Contains(x.TypeId))
    .GroupBy(x =>  x.CategoryId)
    .Where(grp => types.All(t => grp.Any(x => x.TypeId == t)))
    .SelectMany(grp => grp);

首先,这会过滤掉TypeId为10或20的行。然后它会在CategoryId上进行分组。然后它会筛选出不具有至少一行且TypeId为10和20的组。最后,它会将剩余的组展平。

我并非100%确定EF或您使用的任何Linq提供商都会喜欢这样。您可能需要在AsEnumerable()之后添加GroupBy

不使用List<int>且应与EF兼容的替代方案

var query = db.Table
    .Where(x => x.TypeId == 10 || x.TypeId == 20)
    .GroupBy(x =>  x.CategoryId)
    .Where(grp => grp.Any(x => x.TypeId == 10) && grp.Any(x => x.TypeId == 20))
    .SelectMany(grp => grp);