国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁(yè) > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

Dapper把EF性能甩開(kāi)47%:這個(gè).Net微ORM讓SQL查

0
分享至


去年Stack Overflow開(kāi)發(fā)者調(diào)查有個(gè)反直覺(jué)的數(shù)據(jù):在仍在使用ORM的.Net開(kāi)發(fā)者中,31%的人同時(shí)裝了Dapper和EF Core。不是遷移失敗,是故意兩頭下注。

這像極了手機(jī)殼里塞兩張SIM卡的人——主號(hào)用來(lái)收驗(yàn)證碼,副號(hào)專(zhuān)門(mén)跑流量。EF Core負(fù)責(zé)CRUD的臟活累活,Dapper頂上那些老板盯著KPI的報(bào)表接口。

微軟MVP Jeremy Miller說(shuō)過(guò)一句得罪人的話:「Entity Framework是數(shù)據(jù)庫(kù)訪問(wèn)的自動(dòng)擋,Dapper是手動(dòng)擋帶換擋撥片?!棺詣?dòng)擋堵車(chē)時(shí)舒服,但下賽道你還得自己掛擋。

1. 為什么Dapper能快出半個(gè)身位

BenchmarkDotNet的實(shí)測(cè)數(shù)據(jù)很直白:同樣查10萬(wàn)條記錄,Dapper比EF Core快47%,內(nèi)存占用少62%。差距來(lái)自一個(gè)設(shè)計(jì)取舍——Dapper不幫你生成SQL。

它把自己定位成「結(jié)果映射器」,而非「查詢生成器」。你手寫(xiě)SELECT * FROM influencers WHERE ID = 1,它只管把返回的數(shù)據(jù)行塞進(jìn)C#對(duì)象。沒(méi)有表達(dá)式樹(shù)解析,沒(méi)有LINQ轉(zhuǎn)SQL的翻譯損耗,更沒(méi)有變更追蹤的內(nèi)存開(kāi)銷(xiāo)。

這種「微ORM」的極簡(jiǎn)主義,讓它在GitHub攢了17.5k星。Stack Overflow的生產(chǎn)環(huán)境跑了13年Dapper,每天扛住數(shù)億查詢——?jiǎng)?chuàng)始人Jeff Atwood親口承認(rèn),這是他們能省下一半數(shù)據(jù)庫(kù)服務(wù)器的關(guān)鍵。

但代價(jià)是顯性的。沒(méi)有遷移工具,沒(méi)有導(dǎo)航屬性,沒(méi)有SaveChanges()的批量?jī)?yōu)化。你得自己管連接池、自己拼參數(shù)化查詢、自己處理N+1問(wèn)題。換句話說(shuō),Dapper把ORM的舒適區(qū)拆了,換成一張性能兌換券。

2. 一個(gè)社交API的實(shí)戰(zhàn)搭建

我們按原文教程走一遍:用.Net 10搭個(gè)極簡(jiǎn)社交后端,Postgres做庫(kù),Dapper做數(shù)據(jù)層。環(huán)境要求很樸素——SDK裝完,數(shù)據(jù)庫(kù)跑起來(lái),DBeaver能連上就行。

裝包只需要兩行CLI:

dotnet add package Dapper

dotnet add package Npgsql

沒(méi)有腳手架,沒(méi)有dotnet ef migrations add的儀式感。Dapper的哲學(xué)是:你的SQL文件就是版本控制。

依賴(lài)注入的配法也直白。在Program.cs里扔一個(gè)IDbConnection的Singleton:


builder.Services.AddSingleton(sp => new NpgsqlConnection(connectionString));

然后Repository層直接構(gòu)造函數(shù)注入,拿_connection.QueryAsync()開(kāi)干。沒(méi)有DbContext的生命周期管理,沒(méi)有ChangeTracker的暗箱操作——連接用完即走,像借圖書(shū)館的書(shū)。

查單條用QuerySingleOrDefault,查列表用Query,帶參數(shù)就new { Id = 1 }。Dapper會(huì)自動(dòng)把匿名對(duì)象轉(zhuǎn)成參數(shù)化查詢,防住SQL注入的同時(shí),讓你免于@id這種樣板代碼。

3. 那些藏在細(xì)節(jié)里的控制感

QuerySingle和QueryFirst的區(qū)別,是Dapper設(shè)計(jì)精妙的縮影。前者要求結(jié)果集必須有且只有一行,多了少了都拋異常;后者只取首行,剩下的無(wú)視。這種區(qū)分在EF Core里被藏得很深,Dapper把它攤在桌面上。

批量操作更有意思。Dapper沒(méi)有AddRange,但給你Execute的批量重載——把對(duì)象列表和SQL模板扔進(jìn)去,它內(nèi)部用ADO.NET的SqlBulkCopy走管道。比逐條Insert快一個(gè)數(shù)量級(jí),代碼卻只要三行。

事務(wù)控制也回歸原始。BeginTransaction()、Commit()、Rollback(),沒(méi)有SaveChanges()的隱式事務(wù),沒(méi)有async/await和DbContext線程安全的糾纏。你寫(xiě)的每一行事務(wù)代碼,都對(duì)應(yīng)數(shù)據(jù)庫(kù)里真實(shí)發(fā)生的BEGIN和COMMIT。

Multi-mapping是Dapper的隱藏技能。一對(duì)多查詢時(shí),用SplitOn參數(shù)指定分割列,它能把扁平結(jié)果集組裝成嵌套對(duì)象。比如 influencers 聯(lián) posts,不用SelectMany,不用Include,一條SQL+一個(gè)Lambda搞定對(duì)象圖。

4. 什么時(shí)候該換Dapper上場(chǎng)

原文作者Grant Devonshire給了一個(gè)實(shí)用判斷:當(dāng)你的數(shù)據(jù)庫(kù)關(guān)系「足夠簡(jiǎn)單」,但性能要求「足夠苛刻」。

簡(jiǎn)單關(guān)系意味著沒(méi)有復(fù)雜的繼承映射、沒(méi)有多對(duì)多中間表的透明處理、不需要跨聚合根的延遲加載??量绦阅芡ǔ3霈F(xiàn)在報(bào)表導(dǎo)出、實(shí)時(shí)大屏、高頻緩存預(yù)熱——這些場(chǎng)景下,EF Core生成的SQL像自動(dòng)翻譯的外語(yǔ),能懂但別扭。

一個(gè)真實(shí)的權(quán)衡案例:某電商平臺(tái)的訂單詳情頁(yè)用EF Core,日均PV 200萬(wàn)沒(méi)問(wèn)題;但后臺(tái)的「昨日全站GMV實(shí)時(shí)看板」切到Dapper,查詢從800ms降到90ms。不是EF Core不能優(yōu)化,是優(yōu)化到同等水平所需的Expression樹(shù)調(diào)試,比手寫(xiě)SQL痛苦十倍。

Stack Overflow的架構(gòu)師Nick Craver透露過(guò)他們的混合策略:90%的代碼走Dapper,剩下10%用EF Core處理極度復(fù)雜的查詢構(gòu)建。這10%的存在,恰恰證明了Dapper的邊界——當(dāng)你的查詢需要運(yùn)行時(shí)動(dòng)態(tài)組裝,手寫(xiě)SQL會(huì)變成字符串拼接的地獄。

Grant在教程結(jié)尾留了個(gè)開(kāi)放清單:倉(cāng)儲(chǔ)模式抽象、單元測(cè)試的內(nèi)存數(shù)據(jù)庫(kù)替換、Dapper.Contrib的CRUD封裝。這些都是生產(chǎn)環(huán)境的必修課,但Dapper選擇不預(yù)裝。

這種「不預(yù)設(shè)最佳實(shí)踐」的姿態(tài),像極了Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)的設(shè)計(jì)哲學(xué)。給你syscall,不給你web框架;給你database/sql,不給你ORM。能走多遠(yuǎn),取決于你愿意為控制感支付多少心智負(fù)擔(dān)。

所以最后一個(gè)問(wèn)題留給正在讀的你:你的項(xiàng)目里,有沒(méi)有哪個(gè)接口慢到讓你想手寫(xiě)SQL,卻又被EF Core的遷移成本和團(tuán)隊(duì)習(xí)慣綁住手腳?

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
3月30日?qǐng)?zhí)行!不用再買(mǎi)墓地,國(guó)家將正式放開(kāi)殯葬新抉擇

3月30日?qǐng)?zhí)行!不用再買(mǎi)墓地,國(guó)家將正式放開(kāi)殯葬新抉擇

青梅侃史啊
2026-03-26 20:21:55
伊朗已正式回應(yīng)美國(guó)提出的?;饏f(xié)議15點(diǎn)內(nèi)容

伊朗已正式回應(yīng)美國(guó)提出的?;饏f(xié)議15點(diǎn)內(nèi)容

新京報(bào)
2026-03-26 22:00:22
江西安源路橋集團(tuán)有限公司黨支部書(shū)記、董事長(zhǎng)王東被查

江西安源路橋集團(tuán)有限公司黨支部書(shū)記、董事長(zhǎng)王東被查

瀟湘晨報(bào)
2026-03-25 16:16:44
14.99萬(wàn)!“史上最便宜”特斯拉來(lái)了

14.99萬(wàn)!“史上最便宜”特斯拉來(lái)了

首席品牌觀察
2026-03-24 16:18:39
因媽媽姓氏太特殊,全家一致通過(guò)“隨母姓”,網(wǎng)友:是我也隨母姓

因媽媽姓氏太特殊,全家一致通過(guò)“隨母姓”,網(wǎng)友:是我也隨母姓

譚老師地理大課堂
2026-03-24 07:37:08
何超瓊沒(méi)想到,倒貼14億嫁東北小伙的何超盈,如今竟給她狠狠長(zhǎng)臉

何超瓊沒(méi)想到,倒貼14億嫁東北小伙的何超盈,如今竟給她狠狠長(zhǎng)臉

往史過(guò)眼云煙
2026-03-26 20:33:55
是時(shí)候說(shuō)出真相!打越南時(shí)損失或超乎想象,從犧牲的名將后代便知

是時(shí)候說(shuō)出真相!打越南時(shí)損失或超乎想象,從犧牲的名將后代便知

輿圖看世界
2026-03-26 09:15:03
伊朗最高領(lǐng)袖死里逃生細(xì)節(jié)曝光: 最可怕的“內(nèi)鬼”亮相了!

伊朗最高領(lǐng)袖死里逃生細(xì)節(jié)曝光: 最可怕的“內(nèi)鬼”亮相了!

仕道
2026-03-23 10:34:55
追悼會(huì)前,張雪峰婚姻狀況被扒,現(xiàn)任身份不一般,恐影響遺產(chǎn)分配

追悼會(huì)前,張雪峰婚姻狀況被扒,現(xiàn)任身份不一般,恐影響遺產(chǎn)分配

喜歡歷史的阿繁
2026-03-26 14:40:54
日本公布中國(guó)游客免稅店2月份消費(fèi)數(shù)據(jù),真的是打臉了!

日本公布中國(guó)游客免稅店2月份消費(fèi)數(shù)據(jù),真的是打臉了!

消失的電波
2026-03-26 15:20:44
干翻埃爾法?尊界MPV實(shí)車(chē)曝光,前臉照搬S800

干翻埃爾法?尊界MPV實(shí)車(chē)曝光,前臉照搬S800

泡泡網(wǎng)
2026-03-26 11:21:11
馬英九疑似患失智癥,臺(tái)律師:大陸已注意到,沒(méi)讓其擔(dān)任統(tǒng)一大使

馬英九疑似患失智癥,臺(tái)律師:大陸已注意到,沒(méi)讓其擔(dān)任統(tǒng)一大使

愛(ài)意隨風(fēng)起呀
2026-03-26 16:51:41
伊朗對(duì)以色列發(fā)起導(dǎo)彈打擊 以多地響起防空警報(bào)

伊朗對(duì)以色列發(fā)起導(dǎo)彈打擊 以多地響起防空警報(bào)

財(cái)聯(lián)社
2026-03-26 14:50:24
初代丑男何潤(rùn)東的突然爆火,狠狠抽了內(nèi)娛一巴掌

初代丑男何潤(rùn)東的突然爆火,狠狠抽了內(nèi)娛一巴掌

娛樂(lè)圈筆娛君
2026-03-24 16:08:36
拼了!第80波打擊,拒絕停戰(zhàn)伊朗越打越狠,美軍航母基地集體被揍

拼了!第80波打擊,拒絕停戰(zhàn)伊朗越打越狠,美軍航母基地集體被揍

卷史
2026-03-26 09:34:56
巴蒂:馬拉多納離世時(shí)身邊沒(méi)有人,最后走得像條狗一樣

巴蒂:馬拉多納離世時(shí)身邊沒(méi)有人,最后走得像條狗一樣

懂球帝
2026-03-26 06:43:02
舊手機(jī)回收價(jià)狂漲五六倍!回收商:開(kāi)不了機(jī)的照樣高價(jià)收

舊手機(jī)回收價(jià)狂漲五六倍!回收商:開(kāi)不了機(jī)的照樣高價(jià)收

快科技
2026-03-25 14:53:24
黃金,注意!無(wú)敵掃蕩又要開(kāi)始了!

黃金,注意!無(wú)敵掃蕩又要開(kāi)始了!

楊子黃金
2026-03-26 09:06:53
TOP14位身高170以上的女神,有顏有燈有演技

TOP14位身高170以上的女神,有顏有燈有演技

素然追光
2026-01-02 02:45:02
跌跌跌!繼續(xù)!2026年3月23日 - 飛天茅臺(tái)和生肖酒每日行情價(jià)格

跌跌跌!繼續(xù)!2026年3月23日 - 飛天茅臺(tái)和生肖酒每日行情價(jià)格

王二哥老搞笑
2026-03-23 20:00:01
2026-03-26 23:11:00
像素與芯片
像素與芯片
有態(tài)度網(wǎng)友ytd
503文章數(shù) 2關(guān)注度
往期回顧 全部

科技要聞

美團(tuán)發(fā)布外賣(mài)大戰(zhàn)后成績(jī)單:虧損超200億

頭條要聞

張雪峰留巨額遺產(chǎn):二婚妻子或拿50% 剩下的女兒占1/3

頭條要聞

張雪峰留巨額遺產(chǎn):二婚妻子或拿50% 剩下的女兒占1/3

體育要聞

申京努力了,然而杜蘭特啊

娛樂(lè)要聞

劉曉慶妹妹發(fā)聲!稱(chēng)姐姐受身邊人挑撥

財(cái)經(jīng)要聞

油價(jià)"馴服"特朗普?一到100美元就TACO

汽車(chē)要聞

一汽奧迪A6L e-tron開(kāi)啟預(yù)售 CLTC最大續(xù)航815km

態(tài)度原創(chuàng)

游戲
數(shù)碼
本地
公開(kāi)課
軍事航空

50萬(wàn)銷(xiāo)量達(dá)成!這款I(lǐng)GN 9分獨(dú)游走紅 官方發(fā)推慶賀

數(shù)碼要聞

Intel IBOT加速技術(shù)揭秘!硬件不變 白嫖22%游戲性能

本地新聞

救命,這只醬板鴨已經(jīng)在我手機(jī)復(fù)仇了一萬(wàn)遍

公開(kāi)課

李玫瑾:為什么性格比能力更重要?

軍事要聞

擔(dān)心特朗普突然停戰(zhàn) 以總理下令48小時(shí)盡力摧毀伊設(shè)施

無(wú)障礙瀏覽 進(jìn)入關(guān)懷版