簡體   English   中英

在EF Core 2.1中的DbContext上執行RAW SQL

[英]Execute RAW SQL on DbContext in EF Core 2.1

對此進行了研究,並始終找到如下示例:

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

問題是,我不想在Blogs表上運行原始SQL。 基本上,我想實現這樣的接口:

bool ExecuteNonSafeSql(
    string connectionString,
    string sql);

有沒有辦法用DbContext做到這一點?

在撰寫本文時(EF Core 2.1),尚無辦法執行返回 SQL命令的任意安全性

通過FromSql僅支持實體類型和查詢類型

因此,最接近的解決方案是定義查詢類型(一個保存查詢結果的類)並使用FromSql ,但這不是通用的-查詢類型必須通過fluent 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");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM