2013-04-30 80 views
3

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

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

我试过所有在这里解释的语法:How to use DbContext.Database.SqlQuery<TElement>(sql, params) with stored procedure? 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; 

我使用ASP.NET MVC 4,.NET 4.5,SQL Server 2008和实体框架5。

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

回答

-1

怎么样试试这个

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) 
+0

我也尝试过这一点。事实上,我认为这是我的第一次尝试之一。它不会抛出异常,但查询返回零结果。谢谢。 – 2013-04-30 13:54:05

+0

您是否尝试在SQL Management Studio中使用查询? – 2013-04-30 13:56:27

+0

什么是您的keywordSearchTerms? 这是一个单词吗?或多个词? – 2013-04-30 14:36:57

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(); 
+0

我试过了。它抛出一个SqlException:必须声明标量变量“@searchTerm”。感谢您的建议。 – 2013-04-30 13:52:05

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();