2012-06-18 5 views
7

私は、次のLINQクエリを持っている:なぜLINQ-to-Entitiesはこのクエリをサブ選択に入れるのですか?

var queryGroups = (from p in db.cl_contact_event 
        select new Groups { inputFileName = p.input_file_name }).Distinct(); 

実行すると、以下に換算さ:

SELECT 
[Distinct1].[C1] AS [C1], 
[Distinct1].[input_file_name] AS [input_file_name] 
FROM (SELECT DISTINCT 
     [Extent1].[input_file_name] AS [input_file_name], 
     1 AS [C1] 
     FROM [mel].[cl_contact_event] AS [Extent1] 
) AS [Distinct1] 

今、私は私が持っているので、サブ選択がある理由があることをかなり確信しています()で囲まれたベースのLINQクエリを実行して.Distinct()を実行しますが、これを確認するにはLINQについて十分にわかりません。それが本当にケースの場合、サブ選択が発生しないようにクエリを再構成/コード化する方法がありますか?

私はここではちょうど私が拾っているようですが、私は興味があると思います。

+0

[タグ:linq-to-sql]、[タグ:linq-to-entities]または[タグ:linq-to-nhibernate]はありますか? –

+0

@DannyVarod linq-to-entities私はEF4を使っているので、私はSybaseデータベースに問い合わせていると思います。 – Kittoes0124

+0

その場合は、使用したタグを変更し、それに応じて質問のタイトルを更新します。 –

答えて

4

私は、サブクエリの実際の根本原因が匿名型のコンストラクタであると考えています。既知のエンティティを選択するのではなく、他のエンティティ値から構築された任意のオブジェクトを選択するため、EFパーサーは、単一のテーブル、結合テーブル、計算フィールド、その他のフィールドの正確なセットを生成できることを確認する必要がありますサブクエリなどがあります。式ツリーパーサは、可能な限りSQL文をLINQクエリから作成するのに非常に優れていますが、それは全体的ではありません。それは、常に最適な結果ではないが、あなたが求めたものを得るという意味で、正しい結果を常にもたらすシステム的な方法でクエリを処理する。

サブセレクションを削除するためにクエリを書き直すまでは、まず、匿名型を排除して正しい結果を生成する明白な方法はありません。しかし、さらに重要なことに、私はは気にならないでしょう。 Sybaseのような現代のSQLサーバーは、開発者よりもスマートであり、クエリから最適なクエリプランを作成するのに非常に優れています。それに加えて、EFは、サブクエリが、自動化された方法で複雑なクエリを書くのに非常に適しているため、サブクエリが大好きです。 LINQクエリが使用されていない場合でも、それらを見つけることがよくあります。あなたの質問からすべてを取り除こうとすると、すぐに無駄になるようになります。

+0

優れた詳細な応答をありがとう。私は、明らかな間違いをしていないことを確認したかっただけです。 – Kittoes0124

4

私はこの特定の状況についてまったく心配しません。とにかく、外部のSelectステートメントを最適化します。私は、このSQLステートメントが生成される理由は、これが最も汎用的で再利用可能なステートメントであることを理論化します。私の経験から、これはいつもDistinct()で起こります。

関連する問題