代码之家  ›  专栏  ›  技术社区  ›  J86

在EF Core 2.1中的DbContext上执行原始SQL

  •  1
  • J86  · 技术社区  · 7 年前

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

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

    bool ExecuteNonSafeSql(
        string connectionString,
        string sql);
    

    有没有一种方法可以通过DbContext实现这一点?

    3 回复  |  直到 7 年前
        1
  •  6
  •   Ivan Stoev    7 年前

    在编写本文时(EF Core 2.1),无法执行任意命令 分岔返回 SQL命令。

    仅实体类型和 Query Types 通过以下方式提供支持: FromSql

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

    class ResultType
    {
       // ...
    }
    

    然后

    modelBuilder.Query<ResultType>();
    

    最后

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

    注意 Database.ExecuteSqlCommand 可以执行任意SQL,但不能用于返回序列( IEnumerable<T> , IQueryable<T> ).

        2
  •  6
  •   Thom Kiesewetter    7 年前

    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))
    
        3
  •  2
  •   er-sho    7 年前

    你可以用 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");