Linq 下的 Take() 方法内部机制是怎样的?
咨詢區
Rahul Kishore:
我的web需要訪問數據庫,但是表比較大,我僅僅想要獲取該表中 N 條數據,我查閱了 MSDN 文檔,看到了一個 Take() 方法,我現在很疑惑它的運行機制是下面哪一種?
先從數據庫中獲取所有記錄,然后在內存中獲取 N 條記錄。
直接生成 TOP 關鍵詞到數據庫中。
請求大家的幫助。
回答區
Nic:
Take(N) 會在你的 sql 語句中添加 TOP N 關鍵詞,這樣你就可以獲取前 N 條記錄,參考如下 LINQ 語句。
var?query?=?await?dbContext.Lookup.Where(w?=>?w.LookupCd?==?'1').Take(10).ToListAsync();生成的sql腳本。
SELECT?TOP?(10)?[Extent1].[LookupId]?AS?[LookupId],?[Extent1].[LookupTypeId]?AS?[LookupTypeId],?[Extent1].[LookupCd]?AS?[LookupCd],?[Extent1].[LookupName]?AS?[LookupName],?[Extent1].[LookupDescription]?AS?[LookupDescription] FROM?[dbo].[Lookup]?AS?[Extent1] WHERE?'1'?=?[Extent1].[LookupCd]如果你用的是 SQL Server 的話,可以用 SQL Profiler 去捕獲下生成出來的 SQL, 它是一個練習 LINQ 寫法的好工具。
更多可以參考MSDN文檔:https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/linq/return-or-skip-elements-in-a-sequence?redirectedfrom=MSDN
Jon Hanna:
它會按照你認為的最好預期去執行的。
你的 Database SDK 引擎知道針對不同數據庫切換不同的查詢關鍵詞,比如說:對于 PostgreSQL, MySQL 或者 SQL Lite 這三種會生成 LIMIT,如果是 DB2 的話,會生成 "select first " + n + "from" ,如果是 Oracle 的話,又是 select * from (" + restOfQuery + ") where rownum <= " + n 。
只要有人針對某種數據庫寫了一套 linq to sql 引擎,所以只要引擎支持的語法,你都不需要過度擔心。
順便提一下,針對First()擴展方法 ,SQL語句可能會變成 top 1 ,對于 Single() 方法,SQL語句可能會生成 top 2,這么做的原因是 sdk 引擎可以方便的測試當前是不是 only 1,如果不是就會拋出異常。
點評區
現在連接數據庫的sdk已經非常智能了,如果項目復雜度不高的話,大可以愉快的使用各種如 EntityFramework,Nhibernate,如果業務復雜度高,可以使用 Dapper 之類的半自動化框架。
總結
以上是生活随笔為你收集整理的Linq 下的 Take() 方法内部机制是怎样的?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dapr牵手.NET学习笔记:Actor
- 下一篇: .NET6下周发布真的香,可不少人却只会