日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Linq 下的 Take() 方法内部机制是怎样的?

發布時間:2023/12/4 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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() 方法内部机制是怎样的?的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。