【问题标题】:Select rows based on group by counts根据分组计数选择行
【发布时间】:2013-08-20 19:21:08
【问题描述】:

我有一个包含三列的表(学生):
StudentID - MotherID - FatherID

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

我想返回一个包含少于“y”个全兄弟(相同的母亲 ID 和父亲 ID)和少于“z”个半兄弟(相同的父亲 ID 不同的母亲 ID)的学生的列表。

使用 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

在上面的数据sn-p中,学生1有两个同父异母的兄弟姐妹和两个同父异母的兄弟姐妹。 学生 2 有一个同父异母的兄弟姐妹和三个同父异母的兄弟姐妹。

如果我想要一份学生名单,其中全兄弟不超过两个,半兄弟不超过 1 个,如何实现?

【问题讨论】:

  • 同父异母的学生不也是同父异母的兄弟姐妹吗?

标签: c# linq


【解决方案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

请注意,您指定了同父异母的兄弟姐妹共享父亲而不是母亲。

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

【讨论】:

  • 这似乎没有给出我想要获得的正确结果集。我已经编辑了这个问题,希望能澄清一下。
【解决方案2】:

要获得完整兄弟的数量,您需要指定两个键来分组:

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

【讨论】:

  • 这很接近,但没有给出预期的结果。我已经编辑了问题以澄清。
猜你喜欢
  • 2017-02-14
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
相关资源
最近更新 更多