0

我有一个包含三列的表(学生):
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

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

如果我想要一个只有不超过两个同胞兄弟姐妹和不超过一个同胞兄弟姐妹的学生名单,这怎么可能实现?

4

2 回答 2

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

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

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

于 2013-08-20T19:36:13.103 回答
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)。

于 2013-08-20T19:31:45.393 回答