91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

EF?Core如何通過顯式編譯提高查詢性能

發布時間:2022-02-23 12:12:52 來源:億速云 閱讀:482 作者:iii 欄目:開發技術

這篇文章主要講解了“EF Core如何通過顯式編譯提高查詢性能”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“EF Core如何通過顯式編譯提高查詢性能”吧!

在介紹具體內容之前,需要說明一點,EF Core已經對表達式的編譯使用了緩存;當您的代碼需要重用以前執行的查詢時,EF Core將使用哈希查找并從緩存中返回已編譯的查詢。

不過,您可能希望直接對查詢進行編譯,跳過哈希的計算和緩存查找。我們可以通過在EF靜態類中下面兩個方法來實現:

  • EF.CompileQuery()

  • EF.CompileAsyncQuery()

這些方法允許您定義一個已編譯的查詢,然后通過調用一個委托調用它。

為了避免因為數據庫查詢產生測試結果的差異,我們這里使用內存數據庫,它開銷更小,同時也可以避免數據庫優化執行計劃以及緩存所帶來的問題。

實體定義以前數據庫DbContext

定義實體

在這我們定義一個Category實體類型,非常簡單,只有兩個屬性。

    public class Category
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
    }

數據庫DbContext

FillCategories方法中,將內存數據庫中增加三條記錄。

    public class TestDbContext : DbContext
    {
        public TestDbContext(DbContextOptions<TestDbContext> options) : base(options)
        {
        }

        public DbSet<Category> Categories { get; set; }

        public void FillCategories()
        {
            var foodCategory = new Category {
                Id = Guid.NewGuid(),
                Name = "Food"
            };

            Categories.AddRange(foodCategory, new Category {
                Id = Guid.NewGuid(),
                Name = "Drinks"
            }, new Category {
                Id = Guid.NewGuid(),
                Name = "Clothing"
            }, new Category {
                Id = Guid.NewGuid(),
                Name = "Electronis"
            });


            SaveChanges(true);
        }
    }

測試代碼

    public class CompileQueryTest
    {
        private   Func<TestDbContext, Guid, Category> _getCategory =
            EF.CompileQuery((TestDbContext context, Guid id) => context.Categories.FirstOrDefault(c => c.Id == id));

        private readonly TestDbContext _dbContext;

        public CompileQueryTest()
        {
            var options = new DbContextOptionsBuilder<TestDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options;
            var context = new TestDbContext(options);

            context.FillCategories();

            _dbContext = context;
        }

        private readonly Guid _queryId = Guid.NewGuid();

        [Benchmark]
        public void CompiledQuery()
        {
            _ = _getCategory(_dbContext, _queryId);
        }


        [Benchmark]
        public void UnCompiledQuery()
        {

            _ = _dbContext.Categories.FirstOrDefault(c => c.Id == _queryId);

        }
    }

為了更加接近測試結果,我們在構造函數中創建TestDbContext對象以及填充數據庫。

測試結果

我們使用Benchmark.Net進行基準測試,測試結果如下:

MethodMeanErrorStdDev
CompiledQuery10.59 us0.0580 us0.0543 us
UnCompiledQuery79.55 us0.7860 us0.7353 us

感謝各位的閱讀,以上就是“EF Core如何通過顯式編譯提高查詢性能”的內容了,經過本文的學習后,相信大家對EF Core如何通過顯式編譯提高查詢性能這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

互助| 怀集县| 义乌市| 米易县| 十堰市| 栖霞市| 克拉玛依市| 历史| 京山县| 巨野县| 蚌埠市| 仁怀市| 英吉沙县| 青阳县| 进贤县| 洪湖市| 确山县| 灵山县| 日土县| 江油市| 随州市| 浙江省| 泗洪县| 苏尼特右旗| 无为县| 凌海市| 石景山区| 育儿| 威信县| 安西县| 常熟市| 盐池县| 遵义市| 闸北区| 弥勒县| 扬州市| 饶平县| 故城县| 绩溪县| 桃江县| 台湾省|