SELECT A.X, B.Y
FROM A JOIN B ON A.X = B.Y
この linq メソッド呼び出し (Join への) は、上記の Join を生成します。
var query = A.Join
(
B,
a => a.x,
b => b.y,
(a, b) => new {a.x, b.y} //if you want more columns - add them here.
);
SELECT A.X, B.Y
FROM A LEFT JOIN B ON A.X = B.Y
これらの linq メソッド呼び出し (GroupJoin、SelectMany、DefaultIfEmpty への) は、上記の Left Join を生成します。
var query = A.GroupJoin
(
B,
a => a.x,
b => b.y,
(a, g) => new {a, g}
).SelectMany
(
z => z.g.DefaultIfEmpty(),
(z, b) =>
new { x = z.a.x, y = b.y } //if you want more columns - add them here.
);
ここでの重要な概念は、Linq のメソッドがフラット化された行と列の形状ではなく、階層的に形成された結果を生成するということです。
- Linqは、要素のコレクション(空ではない可能性があります) に
GroupBy
一致するグループ化キーを使用して、階層に整形された結果を生成します。SQL の句は、集計された値でグループ化キーを生成します。操作するサブコレクションはありません。GroupBy
- 同様に、Linq
GroupJoin
は階層的な形状を生成します。つまり、親レコードが子レコードのコレクション(空の場合もあります) に一致します。SQLLEFT JOIN
は、各子レコードに一致する親レコードを生成するか、他に一致するものがない場合は null 子レコードを生成します。Linq の形状から Sql の形状に到達するには、子レコードのコレクションをSelectMany
- で展開し、 を使用して子レコードの空のコレクションを処理する必要がありますDefaultIfEmpty
。
そして、これが質問でそのSQLをリンクしようとする私の試みです:
var query =
from a in Appointment
where a.RowStatus == 1
where a.Type == 1
from b in a.AppointmentFormula.Where(af => af.RowStatus == 1).DefaultIfEmpty()
from d in a.TypeRecord //a has a type column and is related to a table named type, disambiguate the names
from e in a.AppointmentForm.DefaultIfEmpty()
order by a.Type
select new { a.AppointmentId, a.Status, a.Type, a.Title, b.Days, d.Description, e.Form }