エンティティ フレームワークを使用して、パラメータが繰り返される SQL クエリを実行しようとすると問題が発生します。
クエリはキーワード検索であり、異なるテーブルを検索するため、同じパラメーターを何度も使用します。私は LIKE ステートメントを使用しています (はい、FULLTEXTSEARCH を使用する必要があることはわかっていますが、今は時間がありません)。
ここで説明されているすべての構文を試しました: How to use DbContext.Database.SqlQuery<TElement>(sql, params) with stored procedure? EFコードファーストCTP5 であり、それらのどれもクエリを機能させません(返された行はありません)。
クエリでパラメータが繰り返される回数と同じ長さの文字列配列を実行時に作成し、配列のすべての要素にキーワード検索語を入力してみました。次に、それをobject[] parametersとして渡しました。どちらも機能しませんでした。
機能する唯一の方法は、パラメーターがテキスト入力から取得されるため、明らかに悪い考えである検索と置換を行うことです。SQL インジェクション攻撃に対して脆弱になります。
作業コード (SQL インジェクション攻撃に対して脆弱ですが、クエリは行を返します):
//not the real query, but just for you to have an idea
string query =
"SELECT Field1, " +
" Field2 " +
"FROM Table1 " +
"WHERE UPPER(Field1) LIKE '%{0}%' " +
"OR UPPER(Field2) LIKE '%{0}%'";
//keywordSearchTerms is NOT sanitized
query = query.Replace("{0}", keywordSearchTerms.ToUpper());
List<ProjectViewModel> list = null;
using (var context = new MyContext())
{
list = context.Database.SqlQuery<ProjectViewModel>(query, new object[] { }).ToList();
}
return list;
ASP.NET MVC 4、.NET 4.5、SQL Server 2008、Entity Framework 5 を使用しています。
SQLQuery<> メソッドを作成して、クエリ文字列内のパラメーターのすべての出現を設定する方法について何か考えはありますか? どうぞよろしくお願いいたします。