クエリ構文で結合を行う方法に関する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()
?誰でも別の簡単な例を説明したり提供したりできますか?
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
});
ご覧のとおり、結合に関しては、クエリ構文は通常、ラムダ構文よりもはるかに読みやすくなっています。
Justinは、結合の直後にselect
が続く場合の展開を正しく示しました。他に何かがある場合は、transparent identifiers-結合の両方の半分のスコープを伝搬するために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
は透過的な識別子です-しかし、透過的であるため、元のクエリでは表示できません:)
ここで他の回答に追加するには、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句で作成される中間オブジェクトに特に注意してください。
ここでは、入力リスト内のいずれかに一致するproperty1を持つ結合されたオブジェクトも検索します。
私はこれが元の質問者が探していたものよりも少し複雑であることを知っていますが、うまくいけば誰かを助けるでしょう。