私は これを研究しました そしていつもこのような例を見つけました:
var blogs = context.Blogs
.FromSql("SELECT * FROM dbo.Blogs")
.ToList();
問題は、Blogsテーブルで生のSQLを実行したくないということです。基本的に、私は次のようなインターフェースを実装したいと思います。
bool ExecuteNonSafeSql(
string connectionString,
string sql);
DbContextでそれを行う方法はありますか?
執筆時点(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>
)。
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))
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");