私は人を検索するためのかなり複雑な見方をしています。住所、電話番号、電子メール、メンバーシップなど、いくつかのリンクされたテーブルがあります。ビューの名前は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個)で同じ構文になっています。