2

私は人を検索するためのかなり複雑な見方をしています。住所、電話番号、電子メール、メンバーシップなど、いくつかのリンクされたテーブルがあります。ビューの名前はvSeachMemberであり、エンティティも同様です。

SQL Mgmt Studioで次のようにクエリを実行すると、次のようになります。

Select * FROM vSearchMember WHERE FirstName like '%kelly%'

約2秒で実行され、約160,000回の読み取りがあります(SQLプロファイラーを使用して検出)

EFを使用してMVCアプリでこのコードを実行する場合(_dbはコンテキストです):

var p = _db.vSearchMembers.Where(p => p.FirstName.Contains("kelly") ).ToList();

約25秒かかり、12,000,000回の読み取りがあります。

私は自分のビューを事前に生成しようとしましたが、役に立ちませんでした。また、lazyloadをオフにしてみました。何か案は?ありがとう。

EFによって生成されたコード:

exec sp_executesql N'SELECT 
[Extent1].[Id] AS [Id], 
...
FROM (SELECT  
[vSearchMember].[Id] AS [Id],
...     
FROM [dbo].[vSearchMember] AS [vSearchMember]) AS [Extent1]
WHERE ( CAST(CHARINDEX(LTRIM(RTRIM(@p__linq__0)), [Extent1].[FirstName]) AS int)) =
1',N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'kelly'

上記の「...」は簡潔にするために省略されており、各フィールド(29個)で同じ構文になっています。

4

1 に答える 1

1

EFが生成しているSQLを確認してください。このようにコード内の抽出からクエリを分離し、2行目にブレークポイントを設定します

var query = vSearchMembers.Where(p => p.FirstName.Contains("kelly") )
var p = query.ToList();

クエリを調べることでSQLを取得できます。

理由はわかりませんが、手作業でコーディングしたSQLクエリとはかなり異なることは間違いありません。

vSearchMembersDDLを参照することに興味があります。

さらなる編集:

コメントのコードをもう少し読みやすくするために、次のようなことを試してみてください。

var members = db.Members.Where(p => p.FirstName.Contains("kelly");
var query = from m in members
            from s in vSearchMembers.Where(s => s.MemberId == m.MemberId)
            select s;
var p = query.ToList();
于 2013-03-07T18:25:31.570 に答える