根据计数选择行

时间:2013-08-20 19:21:09

标签: c# linq

我有一张桌子(学生)有三列:
StudentID - MotherID - FatherID

我很难理解如何构建LINQ查询来执行以下操作:

我想找回所有同学数量少于'y'(同一母亲身份和父亲身份证)且少于'z'数量的半兄弟(同一父亲身份不同的母亲身份)的学生名单。

使用LINQ,我能够根据半兄弟关系来获得正确的行,但不能获得完整的兄弟关系:

   var c = studentsDT
                .GroupBy(a => new { a.FatherID}).Where(grp => grp.Count() <= halfSiblings)
                .SelectMany(grp => grp.Select(r => r))
                .GroupBy(a => new { a.MotherID}).Where(grp1 => grp1.Count() <= fullSiblings)
                .SelectMany(grp1 => grp1.Select(r1 => r1));

如果表格数据如下所示:
1 100 200
2 101 200
3 100 200
4 100 200
5 101 200

在上面的数据片段中,学生1有两个完整的兄弟姐妹和两个半兄弟姐妹。 学生2有一个完整的兄弟姐妹和三个半兄弟姐妹。

如果我想要一个只有不超过两个兄弟姐妹且不超过一半兄弟的学生的名单,那怎么可能实现呢?

2 个答案:

答案 0 :(得分:1)

要获取完整兄弟姐妹的数量,您需要指定两个分组依据:

var c = studentsDT
    .GroupBy(a => new { a.FatherID, a.MotherID })
    .Where(g => g.Count() <= fullSiblings)
    .SelectMany(g => g)
    .GroupBy(a => a.FatherID)
    .Where(g => g.Count() <= halfSiblings)
    .SelectMany(g => g);

请注意,这会将全兄弟视为半兄弟(即确保全兄弟和半兄弟的总数小于halfSiblings)。

答案 1 :(得分:1)

你想要一个GroupJoin。像这样:

from student in Students
join sibling in Students
    on student.FatherID equals sibling.FatherID
    into siblings
where
    siblings.Count(s => s.MotherID == student.MotherID) < fullSiblingLimit &&
    siblings.Count(s => s.MotherID != student.MotherID) < halfSiblingLimit
select student

请注意,您指定了半兄弟姐妹分享父亲而不是母亲。

如果您的数据集非常大,则可以调整查询以提高效率。