これはlinqでの私の参加です。ラムダでそれを書くための可能な方法はあると思います。
誰かがこれについて何か考えを持っていますか?なにか提案を?
すべてのLINQクエリ式は、「ドット表記」(メソッド呼び出し)に変換できます。これは、基本的にコンパイラが行うことです。ただし、結合(およびその他の操作)に透過的な識別子が導入され、ラムダ式を使用した同等のコードがはるかに面倒になります。
コードがクエリ式と完全に同等になることを考えると、クエリ式のバージョンを使用することをお勧めします。
何らかの理由で本当にドット表記に変換したい場合は、最初に簡単な例を使用して変換することを強くお勧めします。つまり、いくつかのプロパティを持つ単一の結合です。あなたはあなたがしなければならないことの感触を得るでしょう、そしてそれを徐々に積み上げることができます。
クエリ式の変換に関する私のEdulinqの投稿では、コンパイラによって実行されるすべての変換の詳細が示されています。これは、実験の開始点として適しています。
IDEなしで入力したので、間違いなくいくつかの間違いがあります...
join ... on ... equals ... into
になりますGroupJoin
from ... in group.DefaultIfEmpty
になりますSelectMany( group.DefaultIfEmpty)
それ以外は、より多くの匿名タイプを使用してスコープを管理することがすべてです。
var joinResult1 = FormReportDataTable.AsEnumerable()
.GroupJoin(dtFormsCategories.AsEnumerable(),
dr1 => dr1["FormID"], dr2 => dr2["ObjectID"],
(dr1, dr2s) => new {dr1 = dr1, dr2s = dr2s})
.SelectMany(g => g.dr2s.DefaultIfEmpty(), (g, dr2) => new {dr1 = g.dr1, dr2 = dr2 })
.GroupJoin(drEntities.AsEnumerable(),
x => (Guid)x.dr1["EntityID"], er => (Guid)er["ID"],
(x, ers) => new {dr1 = x.dr1, dr2 = x.dr2, ers = ers})
.SelectMany(g => g.ers.DefaultIfEmpty(), (g, er) => new {dr1 = g.dr1, dr2 = g.dr2, er = er })
.GroupJoin(dtCategories.AsEnumerable(),
x => (Guid)x.dr2["CategoryID"], cr => (Guid)cr["ID"],
(x, crs) => new {dr1 = x.dr1, dr2 = x.dr2, er = x.er, crs = crs})
.SelectMany(g => g.crs.DefaultIfEmpty(), (g, cr) => new {dr1 = g.dr1, dr2 = g.dr2, er = g.er, cr = cr })
var joinResult = joinResult1.Select(x => new
{
SubPortalName = x.cr == null ? string.Empty : ...
... //could have posted this code if it was in the question...
});