我的列表折叠的数据如下所示:
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#。
对不起我的英语。
答案 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);