实体框架SqlQuery使用重复参数执行查询

Jua*_*des 3 c# sql sql-server-2008 asp.net-mvc-4 entity-framework-5

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

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

我已经尝试了这里解释的所有语法:如何在存储过程中使用DbContext.Database.SqlQuery <TElement>(sql,params)?EF Code First CTP5 并且它们都不会使查询工作(我得到零返回行).

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

唯一有效的方法是进行搜索和替换,这显然是一个坏主意,因为参数来自文本输入,我将容易受到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;
Run Code Online (Sandbox Code Playgroud)

我正在使用ASP.NET MVC 4,.NET 4.5,SQL Server 2008和Entity Framework 5.

有关如何使SQLQuery <>方法填充查询字符串中所有参数的想法吗?非常感谢您的宝贵时间.

ser*_*lge 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();
Run Code Online (Sandbox Code Playgroud)