3

我在尝试使用实体框架执行带有重复参数的 SQL 查询时遇到了麻烦。

该查询是关键字搜索,它在不同的表中查找,因此多次使用相同的参数。我正在使用 LIKE 语句(是的,我知道我应该使用 FULLTEXTSEARCH,但我现在没有时间)。

我已经尝试了这里解释的所有语法:How to use DbContext.Database.SqlQuery<TElement>(sql, params) with stored procedure?EF Code First CTP5 并且它们都没有使查询工作(我得到零返回行)

我什至尝试在运行时构建一个字符串数组,长度等于参数在查询中重复的次数,然后用关键字搜索词填充数组的所有元素。然后我将它作为object[] 参数传递。也没有用。

唯一可行的方法是进行搜索和替换,这显然是一个坏主意,因为参数来自文本输入,而且我很容易受到 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

5

尝试这个:

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


   context.SqlQuery<ProjectViewModel>(query, new SqlParameter("@searchTerm", searchTerm)).ToList();
于 2013-07-29T11:07:34.203 回答
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 回答