3

LinqPad doc から、Entity Framework とは異なる linq から tsql へのトランスレータを使用していることを理解していると思います。LinqPad のほうが実際には、少なくとも 1 つのケースでより効率的です! 詳細は次のとおりです。

LinqPad は、次の単純な sql クエリを生成します。

SELECT [t0].[personId]
FROM [Person] AS [t0]
WHERE (NOT (([t0].[deleted]) = 1)) AND ([t0].[masterPersonId] = @p0)
ORDER BY [t0].[personId] DESC

この C# linq コードの場合:

int? state = null;
string realmId = null;
int? reviewerId = null;
bool? deleted = false;
long? parentPersonId = 1275660779659;

var query = from person in Persons
     where 
     (!deleted.HasValue || person.Deleted == deleted) && 
     (!state.HasValue || person.personState == state) &&
     (!parentPersonId.HasValue || person.masterPersonId == parentPersonId) && 
     (realmId == null || person.realmId == realmId) &&
     (reviewerId == null ||(person.reviewerId == reviewerId ))
     orderby person.personId descending
     select person.personId;

したがって、LinqPad が上記の linq ステートメントを変換し、パラメーター値が null の場合に余分な sql を削除することがわかります。良い!

ただし、EF は、null パラメーターに関係なく、常にこれを生成します。

SELECT 
[Extent1].[personId] AS [personId]
FROM [dbo].[Person] AS [Extent1]
WHERE (@p__linq__0 IS NULL OR [Extent1].[deleted] = @p__linq__1) AND 
(@p__linq__2 IS NULL OR [Extent1].[personState] = @p__linq__3) AND 
(@p__linq__4 IS NULL OR [Extent1].[masterPersonId] = @p__linq__5) AND 
(@p__linq__6 IS NULL OR [Extent1].[realmId] = @p__linq__7) AND 
((@p__linq__8 IS NULL) OR ([Extent1].[reviewerId] = @p__linq__9))

クエリが遅くなります。LinqPad を使用して EF 用に生成された sql を評価することを望んでいましたが、結果が異なる場合は明らかにそうではありません。LinqPad で EF 接続のカスタム アセンブリをターゲットにできるようです。少なくとも sql クエリをまとめることができるかどうかを確認するために、それをいじってみます。

この道を旅したことがある人、または活用できる EF 設定を知っている人はいますか? EF4 を実行しています。

前もって感謝します。

4

1 に答える 1

1

LinqPad の作成者がこの問題について言及しているこの優れた Web キャストを見つけました。 http://oreilly.com/pub/e/1295

EF ではなく、Linq から SQL への変換を使用していました。

于 2012-06-28T12:37:56.220 に答える