EF Core 執行SQL語句和儲存過程

2022-02-21 15:08:37 字數 2923 閱讀 8542

無論orm有多麼強大,總會出現一些特殊的情況,它無法滿足我們的要求。在這篇文章中,我們介紹幾種執行sql的方法。

在具體內容開始之前,我們先簡單說明一下要使用的表結構。

public class category

public string categoryname

}

category定義了兩個字段:categoryidcategoryname

public class sampledbcontext: dbcontext

protected override void onconfiguring(dbcontextoptionsbuilder optionsbuilder)

;optionsbuilder.usesqlserver(sqlconnectionstringbuilder.connectionstring);

base.onconfiguring(optionsbuilder);

}protected override void onmodelcreating(modelbuilder modelbuilder)

}

我們使用sampledbcontext來訪問資料庫。

entity framework core為dbset提供了乙個擴充套件方法fromsql,用於執行sql語句或儲存過程,以下示例使用fromsql載入所有的資料。

using(var datacontext = new sampledbcontext())

對於帶有引數的sql語句,我們使用c# 6 語法將sql寫成如下:

using(var datacontext = new sampledbcontext())

"); var result = query.tolist();

}

注意:這裡不是直接使用拼接的方式處理sql,而是轉化為引數化的sql語句,這有助於防止sql注入攻擊。我們可以使用sql server profiler幫我們驗證:

如果您不使用c# 6的語法特徵,我們必須使用 @p0、@p1 ... @pn 做為sql語句的引數:

using(var datacontext = new sampledbcontext())

在上述sql語句中中,將@p0對映到categoryid@ p1對映到categoryname

fromsql擴充套件方法返回的是iqueryable物件,要們還可以接著使用一些linq的方法,示例如下:

using(var datacontext = new sampledbcontext())

不過在這裡,使用的是子查詢,使用sql server profiler捕獲到的sql語句如下:

exec sp_executesql n 'select [item].[categoryid], [item].[categoryname] from ( select * from category ) as [item] where [item].[categoryid] = @__categoryid_1 order by [item].[categoryname]', n '@__categoryid_1 int', @__categoryid_1 = 1
提示:使用fromsql時,需要在執行的sql語句中返回所有列,並且列名必須與實體屬性名相匹配,否則執行會出錯。

儲存過程與sql語句寫法基本一致,使用儲存過程的示例如下:

using(var datacontext = new sampledbcontext())

"); var result = query.tolist();

assert.notnull(result);

}

這些引數的順序必須與儲存過程引數的順序一致。

提示:使用fromsql執行儲存過程時,如果使用'where'、'orderby'等linq語法,這些操作不會生成sql語句,而是在.net中對儲存過程返回的集合進行過濾與排序。

dbcontext暴露了乙個database屬性,它包括乙個executesqlcommand方法。此方法返回乙個整數,表示執行的sql語句影響的行數。有效的操作是insertupdatedelete,不能用於返回實體。

using(var datacontext = new sampledbcontext())

where categoryid=");

}

本節介紹了entity framework core中執行sql語句和儲存過程的幾種方法, 希望對您有幫助,謝謝!

2 EF Core 如何顯示執行的SQL語句

除錯的時候需要檢視執行的sql 語句,我一般是使用 sql profiler,當然還有另外一種方式,就是配置ef 日誌,這兩種方式都比較簡單實用,sql profiler可以過濾掉很多自己不想看的日誌,可以只看某乙個ip的日誌,而ef core 的日誌則不可以 todo 我會在這裡新增乙個附件,以後...

EF Core日誌記錄生成的sql語句

net framework的ef想要記錄sql語句就非常簡單了,乙個委託搞定 本文主要講下efcore的 let s begin 1.開發日誌記錄類,實現ilogger介面 using microsoft.extensions.logging using system using system.co...

執行sql語句 檢視SQL語句執行進度資訊

有時候我們跑乙個語句,若修改大表或查詢量很大時候,不知道執行到什麼程度了,什麼時候能執行完成,在5.7版後可以查詢sys.session來觀察 select from sys.session where conn id connection id 模擬對乙個大表執行了alter操作 alter ta...