2

気にしないで、代わりに join/into 構文で解決しました。やっぱり必要なのかもしれません

EntityFramework に対して動作するように Linq 外部結合を取得しようとしています。

public List<OSCDagbokDTO> FillDataForOSCDagbokSO(List<OSCDagbokDTO> oscdagboklista)
{
    var kalla_idn = oscdagboklista.Select(k => k.Kalla_id.GetGuidOrNull()).Distinct().ToList();
    var kallaLista = (from k in _gemensamEntityContext.Kalla
                      where kalla_idn.Contains(k.Kalla_id)
                      select new KallaDTO()
                      {
                          Kalla_id = k.Kalla_id,
                          KallaText = k.KallaText
                      }).ToList();

    var nyOSCDagbokLista = (from o in oscdagboklista
                            from k in kallaLista.DefaultIfEmpty()
                            where o.Kalla_id.GetGuidOrNull() == k.Kalla_id
                            select new OSCDagbokDTO()
                            {
                                Id = o.id,
                                Datum = o.Datum,
                                Enhet_id = o.Enhet_id,
                                Handelse = o.Handelse,
                                Kalla = k,
                                Kalla_id = o.Kalla_id,
                            }).ToList();
    return nyOSCDagbokLista;
}

最初のステートメントは、受信リストのプロパティから ID のリストを取得しています。

2 つ目は、そのリストから DTO オブジェクトを作成することです。

3 つ目は、(思ったとおり) 外部結合を使用して着信リストからすべての項目を取得し、DTO リスト (kallaLista) と結合します。私は DefaultIfEmpty() を使用しています。これは、着信リストからアイテムを除外しないと思っていましたが、そうです!

さまざまなサイトから理解したように、「結合」構文は使用していません。上記の構文は問題ないはずです。より古風ですが、私はそれが好きです。

DefaultIfEmpty() を使用しているときに、DTO リストにないときに受信リストの項目が除外されるのはなぜですか?

4

1 に答える 1

1

親エンティティから子コレクションへのナビゲーション プロパティがある場合、外部結合を実行する非常に簡潔な方法があることを付け加えてもよろしいですか?

ナビゲーション プロパティを持つエンティティOSCDagbok(単数形を推測しているだけです) があるとしますkallaLista。次に、次のことができます。

from o in oscdagboklista
from k in o.kallaLista.DefaultIfEmpty() // mind the "o."
select new OSCDagbokDTO()
...

そうでない場合は、ソリューションに従うことができます。は、外部結合に相当する linq であるintoGroupJoinに変換します。join

于 2012-08-02T22:18:50.083 に答える