【问题标题】:Execute RAW SQL on DbContext in EF Core 2.1在 EF Core 2.1 中的 DbContext 上执行 RAW SQL
【发布时间】:2019-04-30 05:53:42
【问题描述】:

我有researched this 并且总是找到这样的例子:

var blogs = context.Blogs
    .FromSql("SELECT * FROM dbo.Blogs")
    .ToList();

问题是,我不想在 Blogs 表上运行我的原始 SQL。基本上,我想实现这样的接口:

bool ExecuteNonSafeSql(
    string connectionString,
    string sql);

有没有办法用 DbContext 做到这一点?

【问题讨论】:

  • 您可以使用context.Database 的方法,例如context.Database.ExecuteSqlCommand()context.Database.SqlQuery()。使用哪个取决于您到底想做什么。你的语句的返回值是多少?
  • 如果命令执行成功,则返回true。否则,false
  • “成功”是什么意思?你能举个例子吗?
  • hmm 在 MySQL 工作台中,如果我运行查询(无论是选择还是插入都无关紧要),我会得到一个绿色复选标记,告诉我它成功并且 x 行受到影响。所以我想我正在寻找相当于绿色勾号的东西?

标签: c# sql entity-framework ef-core-2.1


【解决方案1】:

在撰写本文时(EF Core 2.1),无法执行任意序列返回 SQL 命令。

FromSql 仅支持实体类型和 Query Types

所以最接近的解决方案是定义查询类型(保存查询结果的类)并使用FromSql,但它不是通用的 - 查询类型必须通过 fluent API 在DbContext 中注册,并且该方法应该接收指定该类型的通用参数,例如

class ResultType
{
   // ...
}

然后

modelBuilder.Query<ResultType>();

最后

db.Query<ResultType>().FromSql(...)

注意Database.ExecuteSqlCommand可以执行任意SQL,但不能用于返回序列(IEnumerable&lt;T&gt;IQueryable&lt;T&gt;)。

【讨论】:

  • 我可以用.ExecuteSqlCommand 运行类似DROP DATABASE IF EXISTS {databaseName}; 的东西吗?
  • @J86 我想你可以。任何标量 DDL、T-SQL、SP、批处理等命令。只是你不能从 SP/function/batch 包含/return SELECT … 中得到结果
【解决方案2】:

你可以使用context.Database.ExecuteSqlCommand()来执行sql。

如果你想使用SqlCommand,你可以通过

获得连接
var cnn = (SqlConnection) context.Database.GetDbConnection();
cnn.Open();
using (var cmd = new SqlCommand(sql, cnn))
using (var rdr = cmd.ExecuteReader(CommandBehavior.SingleResult))

【讨论】:

  • ExecuteSqlCommand 将返回受影响记录的数量。语句无法执行时会抛出异常。
【解决方案3】:

您可以将Database.SqlQuery() 直接用于上下文。

在这里我创建了一个通用函数,它可以直接以数据库为目标而不是实体来执行您的查询。

public static List<T> Execute<T>(MyDbContext context, string query) where T : class
{
    var result = context.Database
                        .SqlQuery<T>(query)
                        .ToList();

    return result;
}

你可以使用上面的函数

var blogs = Execute<Blog>(context, "SELECT * FROM dbo.Blogs");

【讨论】:

  • 有 efcore 的样本吗?
  • @OlorunfemiAjibulu,我现在没有找到任何解决方案。但this 链接可能是你想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多