C# Linq选择包含多个ID的组上的行

C# Linq选择包含多个ID的组上的行,c#,linq,C#,Linq,我的列表中折叠的数据如下所示: 我会的 仅获取具有TypeID 10和20逻辑和条件的组 而不是那些有不同元素的 我的理论结果是 在我的软件中要过滤的项目甚至可以超过两个10、20。 它们可以是从1到n 我的组由TypeID和CategoryId组成 我在vs express上使用c 对不起,我的英语不好。您可以使用匿名类型按多个属性/列进行分组: List<int> types = new List<int>{ 10, 20 }; var query = db.Tabl

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

我会的 仅获取具有TypeID 10和20逻辑和条件的组 而不是那些有不同元素的

我的理论结果是

在我的软件中要过滤的项目甚至可以超过两个10、20。 它们可以是从1到n

我的组由TypeID和CategoryId组成

我在vs express上使用c


对不起,我的英语不好。

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

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());

听起来好像你想要一本书

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);

是的,所以一些地方和包含魔法的东西会让你走很长的路。您尝试了什么?但Contains它不使用逻辑or?Contains使用您写入其中的任何内容。如果您想要一个或使用| |与Where相同。他们用一个表达式来计算@Rahul Singh刚才的TypeId==10,TypeId==20,TypeId==30,TypeId=N。。。这些必须是一个组的一部分,我要理解的是,如何在sql中包含子句,但是带有逻辑,它不会返回第7行和第8行,而是返回第4行。根据OP的评论,我不相信这是正确的。我不能理解这部分。其中Grp=>types.All t=>Grp.Any x=>x.TypeId==t@BruceStackOverFlow当所有类型都存在于任何组中时,它将保留组。基本上,如果它包含的lambda语句对于类型中的所有值都为true,则All返回true。然后,如果它包含的lambda对grp中至少一行返回true,那么Any将返回true。类型。所有循环所有元素类型。Any x=>循环组中的每个元素,并确保其类型相同
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());
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);
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);