1

以下、困っています。

次のような形式を使用して、プロジェクトで LINQ を使用しています。

var query =     
    from obj_i in set1
    join obj_j in set2 on 
        new { 
          JoinField1 = obj_i.SomeField1,
          JoinField2 = obj_i.SomeField2,
          JoinField3 = obj_i.SomeField3,
          JoinField4 = obj_i.SomeField4
        } 
        equals 
        new { 
          JoinField1 = obj_j.SomeOtherField1,
          JoinField2 = obj_j.SomeOtherField2,
          JoinField3 = obj_j.SomeOtherField3,
          JoinField4 = obj_j.SomeOtherField4
        }

しかし、最近、以下も LINQ クエリを記述する「別の方法」であると言われました。

var query =     
    from obj_i in set1
    join obj_j in set2 on       
    obj_i.SomeField1 = obj_j.SomeOtherField1 and
    obj_i.SomeField2 = obj_j.SomeOtherField2 and
    obj_i.SomeField3 = obj_j.SomeOtherField3 and
    obj_i.SomeField4 = obj_j.SomeOtherField4

私が理解しているように、 single を使用するの=は間違っています (特に、==を使用する必要があるため by が適用されない場合equals、しかし使用andも間違ってい&&ますequals

&&where 節でのandの使用を理解できます==。これにより、上記のコードが使用できることがさらに際立ちます。コンパイルすらされないからです。

何か不足していますか?もしそうなら、LINQ を書くこの代替方法についてどこで学べるか教えていただけますか?

4

1 に答える 1

4

しかし、最近、以下も LINQ クエリを記述する「別の方法」であると言われました。

いいえ、表示される 2 番目の構文は正しくありません。試してみると、コンパイルされないことがわかります。

joinLinq クエリ内包表記の句は、Join拡張メソッドの呼び出しに変換されます。たとえば、次のクエリは次のようになります。

var query =
    from x in a
    join y in b
    on x.Foo equals y.Bar
    select Baz(x, y);

次のように翻訳されます。

var query = a.Join(b, x => x.Foo, y => y.Foo, (x, y) => Baz(x, y));

equalsしたがって、 の左右の部分がメソッドの異なるパラメーターに対応していることがわかりますJoin。左側の部分は最初のソースの結合キーを選択し、右側の部分は 2 番目のソースのキーを選択します。次に、これらのキーが相互に照合され、結合が実行されます。これは重要な部分です。on句は自由形式の結合条件を指定していません。各側で結合キーを抽出する方法を指定しています。そのため、左右のキー セレクター明確に分離する必要があります。どちらのソースについても完全なキー情報を抽出する方法がないため、表示する 2 番目の構文は機能しません。結合は、(大まかに) 操作ではなく操作で(x, y)ある、各 の結合条件を評価することによってのみ実行できます。O(n²)O(n)

ただし、等結合よりも柔軟性が必要な場合があります。その場合、クロス結合を使用して結果をフィルタリングできます。

var query =
    from x in a
    from y in b
    where x.Foo == y.Bar
    select Baz(x, y);

またはあなたの場合:

var query =     
    from obj_i in set1
    from obj_j in set2
    where obj_i.SomeField1 == obj_j.SomeOtherField1
    &&    obj_i.SomeField2 == obj_j.SomeOtherField2
    &&    obj_i.SomeField3 == obj_j.SomeOtherField3
    &&    obj_i.SomeField4 == obj_j.SomeOtherField4;
于 2012-05-21T08:30:20.803 に答える