1. ホーム
  2. c#

[解決済み】LINQで1回の結合で複数フィールドの結合を行う方法

2022-04-17 23:09:48

質問

LINQ2DataSetクエリで、複数のフィールドを結合する必要があります(たとえば

var result = from x in entity
join y in entity2 
       on x.field1 = y.field1 
and 
          x.field2 = y.field2

私はまだ適切な解決策を見つけていません(Where句に追加の制約を追加することはできますが、これは適切な解決策とは程遠いものです。 これ のソリューションがありますが、これはequijoinを想定しています)。

LINQでは、1回の結合で複数のフィールドに結合することは可能ですか?

EDIT

var result = from x in entity
             join y in entity2
             on new { x.field1, x.field2 } equals new { y.field1, y.field2 }

は、上記でequijoinを前提とした解として参照したものです。

さらに EDIT

私の最初の例がequijoinであったという批判に答えるために、私はそれを認めます、私の現在の要件はequijoinであり、私はすでに上で言及したソリューションを採用しました。

しかし、私はLINQでどのような可能性があり、どのようなベストプラクティスを採用すべきかを理解しようとしています。私はすぐにテーブルIDで日付範囲クエリジョインを行う必要があり、ちょうどその問題を先取りしていたところです。

いつもながら、たくさんのご指摘とコメントをありがとうございます。

解決方法は?

匿名型を使った解決策で問題ないでしょう。LINQ できる のみ(join句で)表現することができ、実際、元のクエリで表現したいのはこれでした。

もし、何か特別な理由で匿名型を使ったバージョンが気に入らないのであれば、その理由を説明すべきです。

最初に依頼したこと以外のことをしたい場合は、その例を挙げてください。 本当に を行いたい。

はい、quot;日付範囲結合を行うには、代わりにwhere句を使用する必要があります。この2つは意味的には同じなので、利用できる最適化の問題に過ぎません。LINQ to ObjectsにはLINQ to DataSetsも含まれます)Equijoinでは、内部シーケンスに基づくルックアップを作成し、キーとそのキーにマッチするエントリのシーケンスをハッシュテーブルとして考えて、簡単な最適化が行われます。

日付の範囲でそれを行うのは、やや困難です。しかし、あなたがquot;日付範囲結合で何を意味しているかによりますが、次のようなことができるかもしれません。 同様 - もし、同じ年に発生した(しかし同じ日付ではない)2つのエントリーが一致するように、日付のバンド(例えば年ごとに1つ)を作成することを計画しているなら、そのバンドをキーとして使用することで実現可能でしょう。もっと複雑な場合、たとえば結合の一方が範囲を指定し、もう一方が単一の日付を指定してその範囲に含まれる場合にマッチングさせるような場合、これは where 節(2つ目の from 節) IMOです。マッチをより効率的に見つけるために、片側またはもう片側を順番に並べるという特にファンキーなマジックもできますが、それは大変な作業です - 私はパフォーマンスが問題であるかどうかをチェックした後にのみそのようなことをします。