3

私は現在、EF を活用するプロジェクトに取り組んでおり、以下にあるものを処理するためのより効率的またはクリーンな方法があるかどうか疑問に思っています。

SQL Server では、次のようにして必要なデータを取得できました。

SELECT tbl2.* FROM 
dbo.Table1 tbl
INNER JOIN dbo.Table2 tbl2 ON tbl.Column = tbls2.Colunm
WHERE tbl.Column2 IS NULL 

UNION

SELECT * FROM 
dbo.Table2
WHERE Column2 = value 

非常に簡単です。ただし、LINQ には次のようなものがあります。

var results1 = Repository.Select<Table>()
            .Include(t => t.Table2)
            .Where(t => t.Column == null);

var table2Results = results1.Select(t => t.Table2);
var results2 = Repository.Select<Table2>().Where(t => t.Column2 == "VALUE");

table2Results  = table2Results.Concat(results2);

return results2.ToList();

何よりもまず、このコードを含むメソッドの戻り値の型は IEnumerable< Table2 > であるため、最初に Table1 の列が null である Table2 の関連付けをすべて取得します。次に、Table2 レコードを選択して、IEnumerable 型の変数を作成する必要があります。コードの残りの部分は、それが何をするかという点でかなり単純です。

これは私にはひどくおしゃべりに思えますが、私が達成しようとしていることを行うためのより良い方法があると思います. 生成された SQL はひどいものではありません (読みやすくするために列リストを省略しました)

SELECT 
[UnionAll1].*
FROM  (SELECT 
[Extent2].*
FROM  [dbo].[Table1] AS [Extent1]
INNER JOIN [dbo].[Table2] AS [Extent2] ON [Extent1].[Column] = [Extent2].[Column]
WHERE [Extent1].[Column2] IS NULL
UNION ALL
SELECT 
[Extent3].*
FROM [dbo].[Table2] AS [Extent3]
WHERE VALUE = [Extent3].[Column]) AS [UnionAll1]

それで、私が説明したことを行うためのよりクリーンで効率的な方法はありますか? ありがとう!

4

1 に答える 1

2

問題の 1 つは、結果が元の SQL クエリと同じデータを返さない可能性があることです。個別の値をUnion選択し、すべての値を選択します。まず、次のようにコードをより明確にすることができると思います。Union All

// Notice the lack of "Include". "Include" only states what should be returned
// *with* the original type, and is not necessary if you only need to select the
// individual property.
var firstResults = Repository.Select<Table>()
                             .Where(t => t.Column == null)
                             .Select(t => t.Table2);

var secondResults = Repository.Select<Table2>()
                              .Where(t => t.Column2 == "Value");

return firstResults.Union(secondResults);

このクエリで重複が不可能であることがわかっている場合は、Concat代わりに最後の行で使用UNION ALLしてください (現在のコードで表示される が生成されます)。詳細については、こちらを参照してください。Union元のクエリに似たものが必要な場合は、上記の例のように引き続き使用してください。

LINQ-to-Entities は、非常に多くのケースを一般的な方法で処理する必要があるため、常に目的の SQL を生成できるとは限らないことを覚えておくことが重要です。EF を使用する利点は、コードがより表現力豊かになり、明確になり、厳密に型指定されることなどです。そのため、最初に読みやすさを優先する必要があります。次に、プロファイリング時に実際にパフォーマンスの問題が発生した場合、データをクエリする別の方法を検討することをお勧めします。最初に 2 つのクエリをプロファイリングすると、この質問に対する答えを気にすることさえなくなるかもしれません。

于 2013-01-29T14:27:26.900 に答える