自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Entity Framework性能翻車(chē)?手寫(xiě)SQL不如試試這三招!

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
我們能夠有效地提升Entity Framework的性能,避免出現(xiàn)“性能翻車(chē)”的情況。在大多數(shù)場(chǎng)景下,這些優(yōu)化技巧能夠讓EF在性能上與手寫(xiě)SQL相媲美,甚至在某些復(fù)雜業(yè)務(wù)邏輯場(chǎng)景中更具優(yōu)勢(shì)。開(kāi)發(fā)者們可以根據(jù)實(shí)際項(xiàng)目需求,靈活運(yùn)用這些技巧,打造高性能的.NET應(yīng)用程序。?

在現(xiàn)代.NET應(yīng)用開(kāi)發(fā)中,Entity Framework(EF)作為一款強(qiáng)大的對(duì)象關(guān)系映射(ORM)框架,極大地簡(jiǎn)化了數(shù)據(jù)庫(kù)操作,讓開(kāi)發(fā)者能夠以面向?qū)ο蟮姆绞脚c數(shù)據(jù)庫(kù)交互。然而,在某些復(fù)雜場(chǎng)景或?qū)π阅芤髽O高的應(yīng)用中,EF有時(shí)會(huì)出現(xiàn)性能不佳的情況,甚至被開(kāi)發(fā)者吐槽“性能翻車(chē)”。當(dāng)面臨這種困境時(shí),很多人可能會(huì)傾向于回歸手寫(xiě)SQL,認(rèn)為這樣能更精準(zhǔn)地控制數(shù)據(jù)庫(kù)查詢。但實(shí)際上,通過(guò)一些優(yōu)化技巧,EF同樣可以在性能上有出色表現(xiàn)。本文將為大家介紹3招提升Entity Framework性能的方法,讓你無(wú)需手寫(xiě)SQL也能實(shí)現(xiàn)高效的數(shù)據(jù)訪問(wèn)。

第一招:合理使用Include和ThenInclude進(jìn)行數(shù)據(jù)預(yù)加載 

在使用EF進(jìn)行數(shù)據(jù)查詢時(shí),經(jīng)常會(huì)遇到需要同時(shí)獲取主實(shí)體及其相關(guān)聯(lián)的導(dǎo)航屬性數(shù)據(jù)的情況。如果不進(jìn)行合理的預(yù)加載,EF可能會(huì)對(duì)每個(gè)導(dǎo)航屬性進(jìn)行額外的數(shù)據(jù)庫(kù)查詢,這種現(xiàn)象被稱(chēng)為“N + 1問(wèn)題”。例如,假設(shè)有一個(gè)Blog實(shí)體,它包含多個(gè)Post實(shí)體,而每個(gè)Post實(shí)體又包含多個(gè)Comment實(shí)體。當(dāng)我們查詢Blog及其相關(guān)的Post和Comment時(shí),如果不進(jìn)行預(yù)加載,查詢Blog會(huì)產(chǎn)生一次數(shù)據(jù)庫(kù)請(qǐng)求,然后對(duì)于每個(gè)Blog中的Post,又會(huì)產(chǎn)生一次數(shù)據(jù)庫(kù)請(qǐng)求,接著對(duì)于每個(gè)Post中的Comment,還會(huì)產(chǎn)生一次數(shù)據(jù)庫(kù)請(qǐng)求,這會(huì)導(dǎo)致大量不必要的數(shù)據(jù)庫(kù)開(kāi)銷(xiāo)。

為了解決這個(gè)問(wèn)題,我們可以使用Include和ThenInclude方法進(jìn)行數(shù)據(jù)預(yù)加載。例如:

using (var context = new YourDbContext())
{
    var blogs = context.Blogs
      .Include(b => b.Posts)
          .ThenInclude(p => p.Comments)
      .ToList();
}

在上述代碼中,通過(guò)Include(b => b.Posts)預(yù)加載了Blog實(shí)體的Posts導(dǎo)航屬性,再通過(guò)ThenInclude(p => p.Comments)預(yù)加載了每個(gè)Post實(shí)體的Comments導(dǎo)航屬性。這樣,EF會(huì)生成一條SQL查詢語(yǔ)句,一次性獲取所有相關(guān)數(shù)據(jù),大大減少了數(shù)據(jù)庫(kù)請(qǐng)求次數(shù),提升了性能。

第二招:優(yōu)化查詢表達(dá)式以減少不必要的計(jì)算和轉(zhuǎn)換 

EF在將LINQ查詢表達(dá)式轉(zhuǎn)換為SQL語(yǔ)句的過(guò)程中,會(huì)進(jìn)行一些內(nèi)部的計(jì)算和類(lèi)型轉(zhuǎn)換。如果我們的查詢表達(dá)式寫(xiě)得不合理,可能會(huì)導(dǎo)致EF生成效率低下的SQL語(yǔ)句。例如,在查詢條件中使用復(fù)雜的函數(shù)調(diào)用或不必要的類(lèi)型轉(zhuǎn)換,可能會(huì)使EF無(wú)法有效地優(yōu)化查詢。

假設(shè)我們有一個(gè)Product實(shí)體,其中有一個(gè)Price屬性。如果我們要查詢價(jià)格大于某個(gè)值的產(chǎn)品,并且在查詢條件中對(duì)Price進(jìn)行了不必要的轉(zhuǎn)換,如下所示:

using (var context = new YourDbContext())
{
    var products = context.Products
      .Where(p => Convert.ToDecimal(p.Price) > 100)
      .ToList();
}

在這個(gè)例子中,Convert.ToDecimal函數(shù)的使用可能會(huì)阻止EF將該查詢條件直接轉(zhuǎn)換為SQL中的比較操作。正確的做法是直接使用Price屬性進(jìn)行比較:

using (var context = new YourDbContext())
{
    var products = context.Products
      .Where(p => p.Price > 100)
      .ToList();
}

這樣,EF能夠更準(zhǔn)確地將查詢表達(dá)式轉(zhuǎn)換為高效的SQL語(yǔ)句,避免了不必要的計(jì)算和轉(zhuǎn)換開(kāi)銷(xiāo),從而提升查詢性能。

第三招:利用EF Core的批量操作庫(kù)提升數(shù)據(jù)更新和插入效率 

在進(jìn)行大量數(shù)據(jù)的更新或插入操作時(shí),EF的默認(rèn)行為是逐條執(zhí)行數(shù)據(jù)庫(kù)操作,這在性能上會(huì)有很大的瓶頸。為了提升批量操作的效率,我們可以借助第三方的EF Core批量操作庫(kù),如Z.EntityFramework.Extensions.EFCore。

例如,當(dāng)我們需要批量更新Product實(shí)體的Stock屬性時(shí),如果使用EF的常規(guī)方式,代碼可能如下:

using (var context = new YourDbContext())
{
    var products = context.Products.ToList();
    foreach (var product in products)
    {
        product.Stock -= 10;
    }
    context.SaveChanges();
}

這種方式會(huì)導(dǎo)致EF為每個(gè)Product實(shí)體生成一條UPDATE語(yǔ)句,在數(shù)據(jù)量較大時(shí)性能很差。使用Z.EntityFramework.Extensions.EFCore庫(kù),我們可以這樣實(shí)現(xiàn)批量更新:

using (var context = new YourDbContext())
{
    context.Products.UpdateRange(p => new Product { Stock = p.Stock - 10 });
    context.SaveChanges();
}

該庫(kù)會(huì)將批量更新操作轉(zhuǎn)換為一條高效的SQL語(yǔ)句,大大減少了數(shù)據(jù)庫(kù)交互次數(shù),顯著提升了數(shù)據(jù)更新的性能。同理,在批量插入數(shù)據(jù)時(shí),也可以使用該庫(kù)提供的方法,如InsertRange,以實(shí)現(xiàn)高效的批量插入操作。

通過(guò)合理使用數(shù)據(jù)預(yù)加載、優(yōu)化查詢表達(dá)式以及借助批量操作庫(kù),我們能夠有效地提升Entity Framework的性能,避免出現(xiàn)“性能翻車(chē)”的情況。在大多數(shù)場(chǎng)景下,這些優(yōu)化技巧能夠讓EF在性能上與手寫(xiě)SQL相媲美,甚至在某些復(fù)雜業(yè)務(wù)邏輯場(chǎng)景中更具優(yōu)勢(shì)。開(kāi)發(fā)者們可以根據(jù)實(shí)際項(xiàng)目需求,靈活運(yùn)用這些技巧,打造高性能的.NET應(yīng)用程序。

責(zé)任編輯:武曉燕 來(lái)源: 程序員編程日記
相關(guān)推薦

2012-07-20 10:38:25

Entity FramEF

2024-06-18 12:58:12

2024-09-23 00:00:00

數(shù)據(jù)庫(kù)場(chǎng)景Entity

2021-12-11 23:01:14

Windows 11Windows微軟

2018-09-11 11:20:11

微軟Windows 10.NET Framew

2009-09-04 14:52:03

ADO.NET Ent

2021-02-04 18:04:53

DbContext開(kāi)源對(duì)象

2019-11-21 09:00:00

數(shù)據(jù)驗(yàn)證EF Core

2024-08-06 08:00:00

SQL Query數(shù)據(jù)庫(kù)

2010-02-23 14:15:26

Entity Fram

2016-08-16 09:06:07

Entity FramT4模板sql語(yǔ)句

2018-02-01 08:02:50

運(yùn)營(yíng)商4G流量

2022-11-16 09:57:23

優(yōu)化接口

2009-12-22 14:46:09

ADO.NET Ent

2012-09-10 10:23:38

Entity Fram

2009-11-03 16:27:43

ADO.NET Ent

2009-12-30 14:03:36

ADO.NET Ent

2024-07-17 08:25:44

2019-11-13 15:40:00

Entity Fram審計(jì)數(shù)據(jù)數(shù)據(jù)庫(kù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)