メソッド構文を使用してlinqからsqlに結合するにはどうすればよいですか?


193

クエリ構文で結合を行う方法に関するLINQ to SQLの例をたくさん見ましたが、メソッド構文でそれを行う方法を知りたいですか?たとえば、どうすれば次のことができますか

var result = from sc in enumerableOfSomeClass
             join soc in enumerableOfSomeOtherClass
             on sc.Property1 equals soc.Property2
             select new { SomeClass = sc, SomeOtherClass = soc }

.Join()?誰かが別の簡単な例を説明したり提供したりできますか?

回答:


282
var result = from sc in enumerableOfSomeClass
             join soc in enumerableOfSomeOtherClass
             on sc.Property1 equals soc.Property2
             select new { SomeClass = sc, SomeOtherClass = soc };

以下と同等になります。

var result = enumerableOfSomeClass
    .Join(enumerableOfSomeOtherClass,
          sc => sc.Property1,
          soc => soc.Property2,
          (sc, soc) => new
                       {
                           SomeClass = sc,
                           SomeOtherClass = soc
                       });

ご覧のとおり、結合に関しては、クエリ構文は通常ラムダ構文よりもはるかに読みやすくなっています。


128

ジャスティンは、結合の直後にが続いている場合の展開を正しく示していselectます。他に何かがある場合は、透過的な識別子( C#コンパイラが結合の両方の半分のスコープを伝播するために使用するメカニズム)により、より扱いにくくなります。

ジャスティンの例を少し変更するには:

var result = from sc in enumerableOfSomeClass
             join soc in enumerableOfSomeOtherClass
             on sc.Property1 equals soc.Property2
             where sc.X + sc.Y == 10
             select new { SomeClass = sc, SomeOtherClass = soc }

このようなものに変換されます:

var result = enumerableOfSomeClass
    .Join(enumerableOfSomeOtherClass,
          sc => sc.Property1,
          soc => soc.Property2,
          (sc, soc) => new { sc, soc })
    .Where(z => z.sc.X + z.sc.Y == 10)
    .Select(z => new { SomeClass = z.sc, SomeOtherClass = z.soc });

これzは透過的な識別子です-しかし、それは透過的であるため、元のクエリではそれを見ることができません:)


5

ここで他の回答に追加して、where句を使用して3番目の異なるタイプの新しいオブジェクト(Entity Frameworkオブジェクトではないオブジェクトなど)を作成する場合は、次のようにします。

public IEnumerable<ThirdNonEntityClass> demoMethod(IEnumerable<int> property1Values)
{
    using(var entityFrameworkObjectContext = new EntityFrameworkObjectContext )
    {
        var result = entityFrameworkObjectContext.SomeClass
            .Join(entityFrameworkObjectContext.SomeOtherClass,
                sc => sc.property1,
                soc => soc.property2,
                (sc, soc) => new {sc, soc})
            .Where(s => propertyValues.Any(pvals => pvals == es.sc.property1)
            .Select(s => new ThirdNonEntityClass 
            {
                dataValue1 = s.sc.dataValueA,
                dataValue2 = s.soc.dataValueB
            })
            .ToList();
    }

    return result;

}    

Where句とSelect句で作成される中間オブジェクトに特に注意してください。

ここでは、入力リストのオブジェクトの1つと一致するproperty1を持つ結合オブジェクトも探すことに注意してください。

これは、元の質問者が探していたものよりも少し複雑であることを知っていますが、うまくいけば誰かを助けるでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.