無論orm有多麼強大,總會出現一些特殊的情況,它無法滿足我們的要求。在這篇文章中,我們介紹幾種執行sql的方法。
在具體內容開始之前,我們先簡單說明一下要使用的表結構。
public class category
public string categoryname
}
在category
定義了兩個字段:categoryid
、categoryname
。
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語句影響的行數。有效的操作是insert
、update
和delete
,不能用於返回實體。
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...