4

私は3つのクラスを持っていてLINQ methods、実行するために使用しようINNER JOINとしていLEFT JOINます. それぞれを個別に実行できますが、構文さえ理解できないため、一緒に実行することはできません。

最終的に、私が書く SQL は次のようになります。

SELECT *
FROM [Group] AS [g]
INNER JOIN [Section] AS [s] ON [s].[GroupId] = [g].[Id]
LEFT OUTER JOIN [Course] AS [c] ON [c].[SectionId] = [s].[Id]

クラス

public class Group {
    public int Id { get; set; }
    public int Name { get; set; }
    public bool IsActive { get; set; }
    public ICollection<Section> Sections { get; set; }
}

public class Section {
    public int Id { get; set; }
    public int Name { get; set; }
    public int GroupId { get; set; }
    public Group Group { get; set; }
    public bool IsActive { get; set; }
    public ICollection<Course> Courses { get; set; }
}

public class Course {
    public int Id { get; set; }
    public int UserId { get; set; }
    public int Name { get; set; }
    public int SectionId { get; set; }
    public bool IsActive { get; set; }
}

サンプル

結果を型にしたいGroupLEFT JOINと の間Sectionを正常に実行しましたCourseが、タイプIQueryable<a> , which is not what I want, sinceGroup` のオブジェクトがあります。

var result = db.Section
               .GroupJoin(db.Course, 
                    s => s.Id,
                    c => c.SectionId,
                    (s, c) => new { s, c = c.DefaultIfEmpty() })
               .SelectMany(s => s.c.Select(c => new { s = s.s, c }));

私もこれを試しましたが、これはすべてのテーブルでNULL実行され、ユーザーが何も入力していないため返されます。INNER JOINCourses

var result = db.Groups
               .Where(g => g.IsActive)
               .Include(g => g.Sections)
               .Include(g => g.Sections.Select(s => s.Courses))
               .Where(g => g.Sections.Any(s => s.IsActive && s.Courses.Any(c => c.UserId == _userId && c.IsActive)))
               .ToList();

質問

データベースへの呼び出し回数を最小限に抑えてINNERとを実行し、タイプ の結果を取得するにはどうすればよいですか?LEFT JOINGroup

望ましい結果

タイプ のオブジェクトを 1 つ持ちたいのですが、 a に aがあるGroup限りのみです。また、ユーザーが特定のまたは returnに対して持っているものを返したいです。GroupSectionCoursesSectionNULL

4

3 に答える 3