1

これはlinqでの私の参加です。ラムダでそれを書くための可能な方法はあると思います。

ここに画像の説明を入力してください

誰かがこれについて何か考えを持っていますか?なにか提案を?

4

2 に答える 2

7

すべてのLINQクエリ式は、「ドット表記」(メソッド呼び出し)に変換できます。これは、基本的にコンパイラが行うことです。ただし、結合(およびその他の操作)に透過的な識別子が導入され、ラムダ式を使用した同等のコードがはるかに面倒になります。

コードがクエリ式と完全に同等になることを考えると、クエリ式のバージョンを使用することをお勧めします。

何らかの理由で本当にドット表記に変換したい場合は、最初に簡単な例を使用して変換することを強くお勧めします。つまり、いくつかのプロパティを持つ単一の結合です。あなたはあなたがしなければならないことの感触を得るでしょう、そしてそれを徐々に積み上げることができます。

クエリ式の変換に関する私のEdulinqの投稿では、コンパイラによって実行されるすべての変換の詳細が示されています。これは、実験の開始点として適しています。

于 2013-03-03T14:53:52.320 に答える
3

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...
});
于 2013-03-05T04:01:03.947 に答える