【问题标题】:Entity Framework SQL Query not Working with SQL Parameters实体框架 SQL 查询不使用 SQL 参数
【发布时间】:2014-08-19 18:26:18
【问题描述】:

我有一个原始 SQL 查询,我正在尝试与 SqlParameters 一起使用。当我不安全地创建查询(使用字符串连接)时,它工作正常......我得到了结果。在这种情况下,我得到 10。

当我尝试使用 SQL 参数时,我得到零记录。我尝试创建带和不带@ 的参数,尝试在对Query 的调用中单独添加它们,并且尝试使用对象参数而不是Sql 参数。我什至尝试过只使用一个....无论我做什么,我似乎都无法使用 SQL 参数获得结果,只能使用字符串连接。

实体框架 SQL 查询如何与 SQL 参数一起使用,为什么我使用的查询不起作用?

示例代码:

string query = "WITH OrderedItems AS " +
               "(" +
               "SELECT *, " +
               "ROW_NUMBER() OVER (ORDER BY @p0) AS 'RowNumber' " +
               "FROM ITEMS" +
               " WHERE item_name LIKE '%@p1%'" +
               ")" +
               "SELECT * FROM OrderedItems" +
               " WHERE RowNumber BETWEEN " + (skip + 1) + " AND " + (skip + take);

// I have tried using @p0 and @p1 as the parameter names here
var parameters = new object[] {new SqlParameter("p0", orderBy), new SqlParameter("p1", model.item_name)};

var context = new DbEntities();
// I have tried only using one and passing it too
List<item> result = context.items.SqlQuery(query, parameters).ToList();

【问题讨论】:

  • 我已经试过了......它没有任何区别 - 我仍然没有得到任何结果 - 我在帖子中说过。

标签: c# sql entity-framework sql-parametrized-query


【解决方案1】:

我认为问题在于您尝试将LIKE 子句与p1 一起使用的方式

参数化将负责引用值。您不应在参数周围提供引号。

尝试将其修改为:

string query = "WITH OrderedItems AS " +
               "(" +
               "SELECT *, " +
               "ROW_NUMBER() OVER (ORDER BY @p0) AS 'RowNumber' " +
               "FROM ITEMS" +
               " WHERE item_name LIKE @p1" +
               ")" +
               "SELECT * FROM OrderedItems" +
               " WHERE RowNumber BETWEEN " + (skip + 1) + " AND " + (skip + take);

var parameters = new object[] {new SqlParameter("p0", orderBy), new SqlParameter("p1", "%" + model.item_name + "%")};

【讨论】:

  • 你是我的英雄。就是这样 - 我在参数周围添加的引号。这也是一种更清洁的方式。
【解决方案2】:

您可能是 ORDER BY 列名,为什么要为此使用参数。问题可能来自 p0 参数。 orderBy 的值是多少它是有效的列吗?!

你也可以使用:

string p = @"

";

在这种情况下,您不需要添加太多“+”。还要添加skip和take作为参数

【讨论】:

  • 即使我直接将列名添加到查询中并且只使用一个参数,我仍然没有得到任何结果。使用 @ 的好技巧
  • 在这种情况下,问题出在 p1 参数中。我认为您可以尝试“Aaron D”解决方案。他写了一个答案。
【解决方案3】:

'%@p1%' 中删除引号和%。然后将 % 添加到您作为参数传递的字符串中。 ... new SqlParameter("p1", "%" + model.item_name + "%") 示例:

select * from mytable where column1 like @p1

filter1 = "%test%";
var parameters = new object[] {new SqlParameter("p1", filter1)}

您的代码将是:

string query = "WITH OrderedItems AS " +
               "(" +
               "SELECT *, " +
               "ROW_NUMBER() OVER (ORDER BY @p0) AS 'RowNumber' " +
               "FROM ITEMS" +
               " WHERE item_name LIKE @p1" +
               ")" +
               "SELECT * FROM OrderedItems" +
               " WHERE RowNumber BETWEEN " + (skip + 1) + " AND " + (skip + take);

var parameters = new object[] {new SqlParameter("p0", orderBy), new SqlParameter("p1", "%" + model.item_name + "%")};
var context = new DbEntities();
List<item> result = context.items.SqlQuery(query, parameters).ToList();

【讨论】:

  • +1。或者,使用" WHERE item_name LIKE '%' + @p1 + '%'"
  • Oups....我正忙着写答案,却没有注意到 Aaron D 先回答了它并使用了相同的方法
  • 是的,绝对是 StriplingWarrior,但我更喜欢将其保留在 c# 代码中,这样您可以选择是否动态使用通配符
【解决方案4】:

您可以使用两种约定来传递参数,基于 namedindex

命名参数约定

string sql = "INSERT INTO SOMETABLE(Column1,Column2,Column3) 
              VALUES(@namedParamOne,@nameParamTwo,@namedParamThree)";

//index based parameter naming convention
List<SqlParameter> parameters = new List<SqlParameter>(){
    new SqlParameter("@namedParamOne","One"),
    new SqlParameter("@nameParamTwo","Two"),
    new SqlParameter("@namedParamThree","Three")
}.ToArray();

基于索引的参数命名约定

string sql = "INSERT INTO SOMETABLE(Column1,Column2,Column3) 
              VALUES(@P0,@P1,@P2)";

List<object> parameters = new List<object>(){
    new "Value 1",
    new "Value 2",
    new "Value 3"
}.ToArray();

执行命令或发出查询

int result = db.Database.ExecuteSqlCommand(sql, parameters);

返回实体你会使用

    string sql = "SELECT * from YourTable
                           where SomeValue=@p0 and SomeOtherValue=@p1";
    List<object> parameters = new List<object>(){
        new "Value 1",
        new "Value 2"
    }.ToArray();

DbSqlQuery<SomeEntity> data = db.SomeEntity.SqlQuery(sql, parameters);

要返回自定义类型,您在数据库上发出查询,而不是在您的 DbSet 上。

DbRawSqlQuery<YourViewModel> data = db.Database.SqlQuery<YourViewModel>(sql, parameters);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多