2017-03-10 9 views
0

スペースを含む可能性のある検索語に基づいて行を返そうとしています。Where節でLINQでエラーが発生する

次のコードは、次のエラーを生成しています。私は何が間違っているのか分かりません。

Contains演算子以外のクエリ クエリのLINQ to SQL実装では、ローカルシーケンスを使用できません。

var searchTerms = term.Split(' ').ToList(); 
var surveys = (from s in dc.BasicNeedsSurveys where s.Hidden == 
false orderby s.CreatedOn descending select s) 
.Where(x => searchTerms.Any(y => y.Contains(x.FirstName)) 
|| searchTerms.Any(y => y.Contains(x.LastName)) 
|| searchTerms.Any(y => y.Contains(x.FEMANumber))); 
+2

エラーメッセージは問題を正確に診断しています。あなたの質問を明確にすることはできますか? –

+0

@ eric-lippert、質問を修正しました。私はラムダを使用して結果を返そうとしていますが、検索用語をマッチのためにさまざまなフィールドに対して試す必要があるところを表現しています。 –

+1

あなたのコードは*特定のテキストを検索しているように見えます*。私は 'searchTerms'はあなたが探している用語のセットだとします。そうであれば、実際には 'searchTerms.Any(y => y.Contains(x.LastName))'ではなく 'searchTerms.Contains(x.LastName)'になるはずです。後者は、 '' test''、 '' this'''という言葉があれば '' hi''を含んでいるので '' hi'''という人とマッチします。 – Rob

答えて

2

あなたは、SQL(またはEF)にLINQを使用しているエラーメッセージに従って。 linq to sqlはシーンの背後でSQLクエリを生成し、SQLクエリ内でsearchTermsなどのローカル変数を使用することはできません。私はそれを正しく理解し、dc.BasicNeedsSurveysは実際にはエンティティのフレームワークのようなデータベースエンティティです(例:SQLのクエリを実行してから、検索結果の部分文字列に検索結果が含まれている場合はテストを実行します)。 ToListはそれを行うことができる1つの関数です。当然の

var searchTerms = term.Split(' ').ToList(); 
var surveys = (from s in dc.BasicNeedsSurveys where s.Hidden == 
false orderby s.CreatedOn descending select s) 
.ToList() 
.Where(x => searchTerms.Any(y => y.Contains(x.FirstName)) 
|| searchTerms.Any(y => y.Contains(x.LastName)) 
|| searchTerms.Any(y => y.Contains(x.FEMANumber))); 

、ここにあなたがハードドライブからそれらのすべてを読んで後にのみ結果をフィルタリングしているため、優れたパフォーマンスとそれを行うには良い方法があるかもしれませんが、十分な情報が質問に実際にそこにありますそのため

+0

これは、それを固定しました、ありがとう! –

+0

データベースですべてを実行する方が良いのではないでしょうか。 @ Robの前提が正しければ、悪いデータのマッチングが終了します。特にデータセットが大きい場合は、dbにクエリを実行させることをお勧めします。隠されたフィールドの単一のフィルターは、おそらく多くのレコードを持つ可能性のあるテーブルの臭いをします。 – pinkfloydx33

+0

もちろん、パフォーマンスが向上します。大規模な組織でのみプログラマにデータベースへのアクセス権がない場合、RavenDBのようないくつかのnoSqlプラットフォームではCANTはdbに対して直接問合せを実行し、一般的にアプリケーション全体でソース管理や簡単な保守のためにSQLを使用しないとパフォーマンスが低下し、このクエリが他のすべてと同じように機能するようにします。質問にはそのような考察のための十分な情報がありません。その答えは具体的にそう言います。その答えは、いくつかの状況に適合する簡単なオプションです –

関連する問題