我在使用实体框架尝试使用重复参数执行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&lt;&gt;的任何想法方法填充查询字符串中所有出现的参数?非常感谢你的时间。
答案 0 :(得分: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();
答案 1 :(得分: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();
答案 2 :(得分:-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)