首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不使用SQL参数的实体框架SQL查询

不使用SQL参数的实体框架SQL查询
EN

Stack Overflow用户
提问于 2014-08-19 18:26:18
回答 3查看 6.8K关注 0票数 1

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

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

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

示例代码:

代码语言:javascript
运行
复制
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();
EN

回答 3

Stack Overflow用户

发布于 2014-08-19 18:45:55

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

此外,您还可以使用:

代码语言:javascript
运行
复制
string p = @"

";

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

票数 1
EN

Stack Overflow用户

发布于 2014-08-19 18:55:40

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

代码语言:javascript
运行
复制
select * from mytable where column1 like @p1

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

你的代码是:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2014-08-19 18:52:09

可以使用两个约定传递参数,即基于索引

命名参数约定

代码语言:javascript
运行
复制
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();

基于索引的参数命名约定

代码语言:javascript
运行
复制
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();

执行命令或发出查询

代码语言:javascript
运行
复制
int result = db.Database.ExecuteSqlCommand(sql, parameters);

若要使用返回实体,请使用

代码语言:javascript
运行
复制
    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上发出查询。

代码语言:javascript
运行
复制
DbRawSqlQuery<YourViewModel> data = db.Database.SqlQuery<YourViewModel>(sql, parameters);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25390452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档