実行に約 6 秒かかるクエリを最適化しようとしています。
string[] filters = ...;
var data =
(from n in ctx.People
.Where(np => np.IsActive)
let isFilterMatch = filters.All(f => n.FirstName.ToLower().Contains(f) ||
n.Prefix.ToLower().Contains(f) ||
n.MiddleName.ToLower().Contains(f) ||
n.LastName.ToLower().Contains(f) ||
n.Information.Email.ToLower().Contains(f) ||
(n.Address!= null &&
(SqlFunctions.StringConvert((double)n.Address.Number).
Contains(f) ||
n.Address.Street.ToLower().Contains(f) ||
n.Address.ZipCode.ToLower().Contains(f) ||
n.Address.City.ToLower().Contains(f))))
where isFilterMatch
orderby n.LastName
select n
).Take(numberOfItems).ToList();
これは検索ダイアログのクエリです。ユーザーは任意のテキストを入力でき、入力内容に一致する人物を検索します。ユーザー入力を文字列配列に分割し、Person フィールドで Contains を実行します。フィルター配列のため、クエリをプリコンパイルできません。
この機能を最適化するにはどうすればよいですか? Sql Server の FullTextSearch やストアド プロシージャなどについて聞いたことがあります。それは役に立ちますか?
Sql Server 2008、Entity Framework 4.0 (Model First)、および C# を使用しています。