1

我有一个原始 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();
4

4 回答 4

8

我认为问题在于您尝试使用该子句的方式LIKEp1

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

尝试将其修改为:

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 + "%")};

于 2014-08-19T18:52:16.407 回答
1

删除引号和%from '%@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();
于 2014-08-19T18:55:40.783 回答
1

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

您也可以使用:

string p = @"

";

在这种情况下,您不需要添加这么多的“+”。还添加跳过并作为参数

于 2014-08-19T18:45:55.037 回答
0

您可以使用两种约定来传递参数,命名或基于索引

命名参数约定

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

要返回自定义类型,请在Database上发出查询,而不是在 DbSet 上。

DbRawSqlQuery<YourViewModel> data = db.Database.SqlQuery<YourViewModel>(sql, parameters);
于 2014-08-19T18:52:09.653 回答