web-dev-qa-db-ja.com

EF Core2.1のDbContextでRAWSQLを実行します

私は これを研究しました そしていつもこのような例を見つけました:

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

問題は、Blogsテーブルで生のSQLを実行したくないということです。基本的に、私は次のようなインターフェースを実装したいと思います。

bool ExecuteNonSafeSql(
    string connectionString,
    string sql);

DbContextでそれを行う方法はありますか?

3
J86

執筆時点(EF Core 2.1)では、任意のsecuencereturningSQLコマンドを実行する方法はありません。

エンティティタイプと クエリタイプ のみがFromSqlを介してサポートされます。

したがって、最も近い解決策は、クエリタイプ(クエリ結果を保持するクラス)を定義してFromSqlを使用することですが、これは一般的ではありません。クエリタイプは、流暢なAPIを介してDbContextに登録する必要があります。メソッドは、そのタイプを指定する一般的な引数を受け取る必要があります。

class ResultType
{
   // ...
}

その後

modelBuilder.Query<ResultType>();

そして最後に

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

ご了承ください Database.ExecuteSqlCommandは任意のSQLを実行できますが、シーケンスを返すために使用することはできません(IEnumerable<T>IQueryable<T>)。

5
Ivan Stoev

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

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");
2
er-sho