如何从EntityFramework Core中的DataContext运行原始SQL查询

时间:2017-04-20 03:47:56

标签: c# linq-to-sql entity-framework-core

我有一个DataContext实例,我想用它来执行原始SQL(如果可能的话)。我记得那"常规" EntityFramework 6可以执行此操作(https://msdn.microsoft.com/en-us/library/bb361109(v=vs.110).aspx),但我无法在Core中找到任何方法。我听说过FromSql扩展方法(https://docs.microsoft.com/en-us/ef/core/querying/raw-sql),但在myContext.myTable时没有显示。

以下是我的参考资料(图片,因为我太懒了,无法输入)。

enter image description here

1 个答案:

答案 0 :(得分:0)

我意识到这是一个老问题,但是无论如何,这里有一些答案。

您有2种选择,具体取决于您要执行的操作:

选项1:DbSet FromSql

using Microsoft.EntityFrameworkCore;
...
var sql = "select * from clients";
var clients = _clientDbContext.Clients.FromSql(sql);

请注意,这要求您具有一个与sql语句的输出和DbContext实现上定义的相关DbSet相匹配的Client实体。

选项2:原始数据访问

using (var conn = (SqlConnection)((DbContext)_clientDbContext).Database.GetDbConnection())
{
    conn.Open();
    using (var reader = new SqlCommand(sql, conn).ExecuteReader())
    {
        ...
    }
    conn.Close();
}

现在,您可以访问原始DbConnection和ADO.NET世界,并且可以使用SqlCommand,DataTables等运行任何SQL并管理自己返回的数据。

我会提醒您不要混合使用实体框架和直接的SQL数据库更新-但这对于拾取一小段数据(例如配置值或运行存储过程)很有用。