私は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; }
}
サンプル
結果を型にしたいGroup
。LEFT JOIN
と の間Section
を正常に実行しましたCourse
が、タイプIQueryable<
a> , which is not what I want, since
Group` のオブジェクトがあります。
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 JOIN
Courses
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 JOIN
Group
望ましい結果
タイプ のオブジェクトを 1 つ持ちたいのですが、 a に aがあるGroup
限りのみです。また、ユーザーが特定のまたは returnに対して持っているものを返したいです。Group
Section
Courses
Section
NULL