【问题标题】:Entity framework SqlQuery execute query with repeated parameter实体框架SqlQuery使用重复参数执行查询
【发布时间】:2014-09-02 13:51:24
【问题描述】:

我在尝试使用实体框架执行带有重复参数的 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 方法填充查询字符串中所有出现的参数有什么想法吗?非常感谢您的宝贵时间。

【问题讨论】:

    标签: c# sql sql-server-2008 asp.net-mvc-4 entity-framework-5


    【解决方案1】:

    试试这个:

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

    【讨论】:

      【解决方案2】:

      您可以在查询中使用参数。像这样的

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

      【讨论】:

      • 我试过这个。它抛出 SqlException:必须声明标量变量“@searchTerm”。感谢您的建议。
      【解决方案3】:

      试试这个怎么样

      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)
      

      【讨论】:

      • 我也试过这个。事实上,我认为这是我的第一次尝试。它不会引发异常,但查询返回零个结果。谢谢。
      • 您是否尝试在 SQL Management Studio 中使用查询?
      • 你的关键字搜索词是什么?是一个词吗?还是多个词?
      • 查询有效。当我在查询字符串上使用 search&replace 时,该方法会返回我为测试准备的某些搜索的结果。它也适用于 SQL 管理工作室。所以不是错误的查询。我认为问题在于 SqlQuery(query, params) 方法不会将查询字符串中的参数占位符替换为经过清理的值。最后,我认为keywordSearchTerms 的值不相关。据我所知,LIKE 运算符适用于字符串,无论是单个单词还是多个单词。感谢您的宝贵时间。
      • 既然是用string.Format代替SqlParameter做参数替换,这种方法是不是容易被SQL注入?
      猜你喜欢
      • 2013-10-18
      • 1970-01-01
      • 2012-07-31
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多