4

2 つのテーブルがあり、左側のテーブルには次のようなデータがあります。

ここに画像の説明を入力

次の式を使用して、別のテーブルとの左結合を行います。

 var result = posicion.Join(fact,
                            p => p.Cod_articulo,
                            f => f.Cod_articulo,
                            (p, f) => new { p.Posicion, p.Cant_historico, 
                                            p.Cod_articulo, f.Cantidad_facturada });

問題は、以下に示すように、左の表の一部の項目が結果に含まれていないことです。

ここに画像の説明を入力

結果でわかるように、位置 3、6 などのデータはありません。私の結合には何が欠けているのでしょうか?

4

2 に答える 2

4

グループ結合 (Linq では左結合) を行う必要があります。クエリ構文を使用することをお勧めします。

from p in posicion
join f in fact
    on p.Cod_articulo equals f.Cod_articulo into g // GroupJoin
from pf in g.DefaultIfEmpty()
select new { 
   p.Posicion, 
   p.Cant_historico, 
   p.Cod_articulo, 
   Cantidad_facturada = (pf == null) ? null : pf.Cantidad_facturada 
}

このクエリは、posicion に対応するすべてのファクトを group に選択しpますg。次に、現在の位置 (ケース) に対応する事実がない場合でも、各グループから結果を選択しますDefaultIfEmpty

ラムダ構文は読みにくくなります:

posicion.GroupJoin(fact,
                   p => p.Cod_articulo,
                   f => f.Cod_articulo,
                  (p, g) => new { p, g })
        .SelectMany(x => x.g.DefaultIfEmpty(), (x, pf) => new {
                x.p.Posicion, 
                x.p.Cant_historico, 
                x.p.Cod_articulo, 
                Cantidad_facturada = (pf == null) ? null : pf.Cantidad_facturada 
        });

次の MSDN 記事もお読みください:方法: 左外部結合を実行する

于 2013-10-31T15:18:25.130 に答える
3

私の参加から何が欠けているでしょうか?

factおそらく、対応するCod_articulo値 (位置 3 の 60155 など)を持つエントリはありません。LINQ では、適切な結果を作成するために両方のソースにJoinエントリが必要な内部結合を表します。

左結合が必要な場合は、通常は を使用GroupJoinして、「左」側の各要素が「右」側のエントリのグループと一致するようにします。この場合、そのグループは空である可能性があります。

于 2013-10-31T15:12:14.090 に答える