3

エンティティ フレームワークを使用して、パラメータが繰り返される 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<> メソッドを作成して、クエリ文字列内のパラメーターのすべての出現を設定する方法について何か考えはありますか? どうぞよろしくお願いいたします。

4

3 に答える 3

0

クエリでパラメーターを使用できます。このようなもの

string query =
 "SELECT Field1, " +
 "       Field2 " +
 "FROM   Table1 " +
 "WHERE  UPPER(Field1) LIKE @searchTerm" +
 "OR     UPPER(Field2) LIKE @searchTerm";

        string search= string.Format("%{0}%", keywordSearchTerms);

        context.SqlQuery<ProjectViewModel>(query, new SqlParameter("@searchTerm", search)).ToList();
于 2013-04-30T09:35:19.127 に答える
-2

これを試してみてはどうですか

string query =
string.Format("SELECT Field1, Field2 FROM   Table1 WHERE  UPPER(Field1) LIKE '%{0}%' 
OR     UPPER(Field2) LIKE '%{0}%'",keywordSearchTerms.ToUpper());

context. Database.SqlQuery< ProjectViewModel >(query)
于 2013-04-30T09:35:17.553 に答える