在EF中使用SQL执行简单高效的增删查操作
隨著平臺(tái)數(shù)據(jù)的積累,對于數(shù)據(jù)訪問的速度要求愈來愈高。優(yōu)化后臺(tái)訪問性能,將是之后的一個(gè)重點(diǎn)任務(wù)。
但是,后臺(tái)在項(xiàng)目開發(fā)初期采用的是Abp(Lite DDD)框架,集成EnityFramework。因?yàn)橹暗捻?xiàng)目經(jīng)驗(yàn)有用過EF,對于開發(fā)者編碼來說,著實(shí)高效。但是之前所處傳統(tǒng)行業(yè),對于數(shù)據(jù)訪問的性能要求并不高。因此也就沒有在意EF的性能問題。然后,有句話叫做“出來混,早晚要還的”。這不,現(xiàn)在的Web項(xiàng)目對于數(shù)據(jù)訪問性能有些吃力了,尤其是涉及使用Linq拼寫出的組合查詢且數(shù)據(jù)量大時(shí),查詢速度慢了下來。
最近也是在一邊完成新功能的開發(fā),一邊通過優(yōu)化語法進(jìn)而優(yōu)化查詢速度。但是,這兩天后臺(tái)倉儲(chǔ)層調(diào)用自帶Api查詢數(shù)據(jù)的奇葩表現(xiàn)令我甚是無奈。在新功能(使用websocket實(shí)時(shí)推動(dòng)數(shù)據(jù))的界面中,調(diào)用后臺(tái)一個(gè)查詢設(shè)備信息的接口,死活查不到實(shí)體數(shù)據(jù)。然后,調(diào)用同樣的接口在其他界面卻可以實(shí)現(xiàn)。不禁令我對該框架產(chǎn)生了很大的疑惑,Why?
不過現(xiàn)在的主要任務(wù)是盡快交付功能,我把問題記下了。
為了實(shí)現(xiàn)在當(dāng)前界面調(diào)用查詢設(shè)備信息的接口可以查到數(shù)據(jù),我注釋掉了Services層對Repository層的調(diào)用Abp.EnityFramework自帶的API查詢數(shù)據(jù),改用組織SQL語句執(zhí)行查詢、刪除、新增。結(jié)果則是正常的可以得到你想要的數(shù)據(jù)。不禁感慨啊,那些個(gè)ORM不是萬能的,純碎的Sql是那么的簡單高效。
下面貼出EF中使用SQL執(zhí)行查詢、刪除及新增的用法:
A,查詢,
var parameter = new SqlParameter("@DeviceId", id);var sqlDeviceInfo = string.Format(@"Select * from dbo.DeviceInfos where dbo.DeviceInfos.Id=@DeviceId");var deviceInfo = await Context.Database.SqlQuery<DeviceInfo>(sqlDeviceInfo, new SqlParameter("@DeviceId", id)).FirstOrDefaultAsync();?
B。刪除
var deviceIdParamter = new SqlParameter("@DeviceId", deviceId);var sqlDeleteId = string.Format(@"Delete from dbo.DeviceAndHiddenTroubleLinks where DeviceId=@DeviceId");var result = await Context.Database.ExecuteSqlCommandAsync(sqlDeleteId, deviceIdParamter);?
C、新增
var sqlAddId = string.Format(@"Insert into dbo.DeviceAndHiddenTroubleLinks(DeviceId,DeviceHiddenTrouble_Id) values (@DeviceId,@HiddenTroubleId)");foreach (var hiddenTroubleId in deviceHiddenTroubleIds){var deviceIdAndHiddenTroubleIdParamter = new DbParameter[] { new SqlParameter { ParameterName = "DeviceId", Value = deviceId }, new SqlParameter { ParameterName = "HiddenTroubleId", Value = hiddenTroubleId } };await Context.Database.ExecuteSqlCommandAsync(sqlAddId, deviceIdAndHiddenTroubleIdParamter);}改完之后發(fā)現(xiàn),直接使用SQL挺爽的??磥砗笈_(tái)性能優(yōu)化又多了條路子。
?
墨匠總結(jié)
以上是生活随笔為你收集整理的在EF中使用SQL执行简单高效的增删查操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS下JS与OC互相调用(六)--WK
- 下一篇: 使用ADO.NET操作数据库