3

適切なテーブルをフィルタリングする必要がある自己結合をマップしようとしています。たとえば、次のような SQL です。

select t2.* from table t 
    left join table t2 
    on t2.parentID = t.ID and t2.active=1;

のテーブルをフィルタリングしたい場合は、構文を理解できます。

// works
var query = from t in table
               where t.active= 1
            join t2 in table
               on t.parentID equals t2.ID into joined
            from r in joined.DefaultIfEmpty() ...

しかし、正しいテーブルをフィルタリングする方法がわかりません。このようなものでなければならないようです...

// does not work
var query = from t in table
            join t2 in table
               where t.field = 1
               on t.parentID equals t2.ID into joined
            from r in joined.DefaultIfEmpty() ...

(有効joinではありません...どこにもありません)。複数の from 句を使用することについての議論がありますが、複数の from 句を作成whereして 2 番目の句に a を追加できるようにすると、それらの結果を新しい一時テーブルに結合する方法がわかりません。

結合の後に「where」を追加することはできません。右側のテーブルを最初にフィルター処理する必要があります。そうしないと、一致が発生whereし、最後の句によって、出力に必要な左側のテーブルから行が削除されます。つまり、出力には、フィルター処理された右側のテーブルから一致するものがない行が含まれている必要があります。したがって、結合する前に適切なテーブルをフィルタリングする必要があります。

4

1 に答える 1

4

私はあなたがこれをやろうとしていると思います:

var query = from t in table
            join t2 in 
               (from t3 in table
                where t3.field = 1
                select t3)
               on t.parentID equals t2.ID into joined
            from r in joined.DefaultIfEmpty() ...

別の方法は、次のように複数を使用することfromです。

var query = from t in table
            from t2 in table.Where(x => x.field = 1)
                            .Where(x => x.ID == t.parentID)
                            .DefaultIfEmpty()
            select ....
于 2013-01-15T20:04:22.860 に答える