2

2 つの DataTablest1t2. t1LINQ の左結合、複数の等価結合を実行して、 にないDataRows を取得しようとしていt2ます。

SQL では、私が達成しようとしているのは次のとおりです。

select t1.* 
from t1
left join t2
on t1.a=t2.a and
   t1.b=t2.b and
   t1.c=t2.c
where
   t2.a is null

これまでのところ、次のものがあります。

public DataTable t1_without_t2(DataTable t1, DataTable t2)
        {
            var query = from t1_row in t1.AsEnumerable()
                        join t2_row in t2.AsEnumerable()
                        on 
                        new { t_a = t1_row["a"], t_b = t1_row["b"], t_c = t1_row["c"]}   
                        equals
                        new { t_a = t2_row["a"], t_b = t2_row["b"], t_c = t2_row["c"]}
                        into leftJoinT1withoutT2
                        from join_row in leftJoinT1withoutT2.DefaultIfEmpty()
                        where t2_row["a"] == null
                        select new
                        {
                            j_a = join_row["a"],
                            j_b = join_row["b"],
                            j_c = join_row["c"],
                        };
            DataTable dt = t1.Clone();
            foreach (var result in query)
            {
                dt.LoadDataRow(
                    new object[]
                    {
                        result.j_a,
                        result.j_b,
                        result.j_c
                    },
                    false);
            }
            return dt;
        }

j_a = join_row["a"]これは、次のメッセージが表示 された行で失敗しています。Column 'a' does not belong to table.

このinto leftJoinT1withoutT2行は、結合の結果を table の列構造を持つ var に入れることになっておりt1、そこから一致しないエントリが を使用して削除されると考えていましwhere t2_row["a"] == nullた。それがここで起こっていることではありませんか?私は少し混乱しています。

4

1 に答える 1

1

次のようになります。

var query = from t1_row in t1.AsEnumerable()
            join t2_row in t2.AsEnumerable()
            on
            new { t_a = t1_row["a"], t_b = t1_row["b"], t_c = t1_row["c"] }
            equals
            new { t_a = t2_row["a"], t_b = t2_row["b"], t_c = t2_row["c"] }
            into leftJoinT1withoutT2
            from join_row in leftJoinT1withoutT2.DefaultIfEmpty()
                                                .Where(r => r == null)
            select new
            {
                j_a = t1_row["a"],
                j_b = t1_row["b"],
                j_c = t1_row["c"],
            };

How to: Perform Left Outer Joins (C# Programming Guide) をご覧ください。

に一致する要素がない場合は取得 (つまり、既定値。 Enumerable.DefaultIfEmpty を参照) しますjoin_rownullTSource常に結合t2t1_rowれた値が含まれます。したがって、 が である行のみが必要な場合join_rownull、 を使用し.Where(r => r == null)ました。

于 2012-12-17T07:44:04.680 に答える