国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Entity Framework】你必須要了解EF中數(shù)據(jù)查詢之?dāng)?shù)據(jù)加載

這篇具有很好參考價(jià)值的文章主要介紹了【Entity Framework】你必須要了解EF中數(shù)據(jù)查詢之?dāng)?shù)據(jù)加載。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

【Entity Framework】你必須要了解EF中數(shù)據(jù)查詢之?dāng)?shù)據(jù)加載


【Entity Framework】你必須要了解EF中數(shù)據(jù)查詢之?dāng)?shù)據(jù)加載,DotNet,# .Net Core,# Entity Framework,.netcore,c#,microsoft,asp.net,ef,數(shù)據(jù)庫

一、概述

Entity Framework Core允許在模型中使用導(dǎo)航屬性來加載關(guān)聯(lián)實(shí)體。有三種常見的O/RM模式可用于加載關(guān)聯(lián)數(shù)據(jù)。

  • 預(yù)先加載表示從數(shù)據(jù)庫中加載關(guān)聯(lián)數(shù)據(jù),作為初始查詢的一部分;
  • 顯示加載表示稍后從數(shù)據(jù)庫中顯示加載關(guān)聯(lián)數(shù)據(jù);
  • 延遲加載表示在訪問導(dǎo)航屬性時(shí),從數(shù)據(jù)庫中以透明方式加載關(guān)聯(lián)數(shù)據(jù);

二、預(yù)先加載

可以使用Include方法來指定要包含在查詢結(jié)果中的關(guān)聯(lián)數(shù)據(jù)。如示例,結(jié)果中,結(jié)果中返回的blogs將使用關(guān)聯(lián)的posts填充其posts屬性。

using (var context = new BloggingContext())
{
    var blogs = context.Blogs
        .Include(blog => blog.Posts)
        .ToList();
}

Entity Framework Core 會(huì)根據(jù)之前已加載到上下文實(shí)例中的實(shí)體自動(dòng)填充導(dǎo)航屬性。 因此,即使不顯式包含導(dǎo)航屬性的數(shù)據(jù),如果先前加載了部分或所有關(guān)聯(lián)實(shí)體,則仍可能填充該屬性。

可以在單個(gè)查詢中包含多個(gè)關(guān)系的關(guān)聯(lián)數(shù)據(jù)。

using (var context = new BloggingContext())
{
    var blogs = context.Blogs
        .Include(blog => blog.Posts)
        .Include(blog => blog.Owner)
        .ToList();
}

2.1 包含多個(gè)層級(jí)

使用ThenInclude方法可以依循關(guān)系包含多個(gè)層級(jí)的關(guān)聯(lián)數(shù)據(jù)。以下示例加載了所有博客,其相關(guān)文章及每篇文章的作者。

using (var context = new BloggingContext())
{
    var blogs = context.Blogs
        .Include(blog => blog.Posts)
        .ThenInclude(post => post.Author)
        .ToList();
}

可通過鏈?zhǔn)秸{(diào)用ThenInclude,進(jìn)一步包含更深級(jí)別的關(guān)聯(lián)數(shù)據(jù)。

using(var context = new BloggingContext())
{
    var blogs = context.Blogs
        .Include(blog       => blog.Posts)
        .ThenInclude(post   => post.Author)
        .ThenInclude(author => author.Photo)
        .ToList();
}

可以將對(duì)來自多個(gè)級(jí)別和多個(gè)根的關(guān)聯(lián)數(shù)據(jù)的所有調(diào)用合并到同一查詢中。

using(var context=new BloggingContext())
{
    var blogs = context.Blogs
        .Include(blog       => blog.Posts)
        .ThenInclude(post   => post.Author)
        .ThenInclude(author => post.Photo)
        .Include(blog       => blog.Owner)
        .ThenInclude(owner  => owner.Photo)
        .ToList();
}

你可能希望將已包含的某個(gè)實(shí)體的多個(gè)關(guān)聯(lián)實(shí)體都包含進(jìn)來。 例如,當(dāng)查詢 Blogs 時(shí),你會(huì)包含 Posts,然后希望同時(shí)包含 PostsAuthorTags。 為了包含這兩項(xiàng)內(nèi)容,需要從根級(jí)別開始指定每個(gè)包含路徑。 例如,Blog -> Posts -> AuthorBlog -> Posts -> Tags。 這并不意味著會(huì)獲得冗余聯(lián)接查詢,在大多數(shù)情況下,EF 會(huì)在生成 SQL 時(shí)合并相應(yīng)的聯(lián)接查詢。

using (var context = new BloggingContext())
{
    var blogs = context.Blogs
        .Include(blog => blog.Posts)
        .ThenInclude(post => post.Author)
        .Include(blog => blog.Posts)
        .ThenInclude(post => post.Tags)
        .ToList();
}

2.2 經(jīng)過篩選的包含

在應(yīng)用包含功能來加載相關(guān)數(shù)據(jù)時(shí),可對(duì)已包含的集合導(dǎo)航應(yīng)用某些可枚舉的操作,這樣就可以對(duì)結(jié)果進(jìn)行篩選和排序。

支持的操作包括:WhereOrderByOrderByDescending、ThenBy、ThenByDescending、SkipTake。

應(yīng)對(duì)傳遞到Include方法的Lambda中的集合導(dǎo)航應(yīng)用這類操作。如下例所示:

using (var context = new BloggingContext())
{
    var filteredBlogs = context.Blogs
        .Include(
            blog => blog.Posts
                .Where(post => post.BlogId == 1)
                .OrderByDescending(post => post.Title)
                .Take(5))
        .ToList();
}

可對(duì)多次包含的每個(gè)導(dǎo)航應(yīng)用相同的操作:

using (var context = new BloggingContext())
{
    var filteredBlogs = context.Blogs
        .Include(blog => blog.Posts.Where(post => post.BlogId == 1))
        .ThenInclude(post => post.Author)
        .Include(blog => blog.Posts.Where(post => post.BlogId == 1))
        .ThenInclude(post => post.Tags.OrderBy(postTag => postTag.TagId).Skip(3))
        .ToList();
}

三、顯示加載

可以通過DbContext.Entry(...) API顯示加載導(dǎo)航屬性。

using(var context=new BloggingContext())
{
    var blog = Context.Blogs.Single(b=>b.BlogId == 1);
    context.Entry(blog).Collection(b=>b.Posts).Load();
    context.Entry(blog)
        .Reference(b => b.Owner)
        .Load();
}

還可以通過執(zhí)行返回關(guān)聯(lián)實(shí)體的單獨(dú)查詢來顯式加載導(dǎo)航屬性。 如果已啟用更改跟蹤,則在查詢具體化實(shí)體時(shí),EF Core 將自動(dòng)設(shè)置新加載的實(shí)體的導(dǎo)航屬性以引用任何已加載的實(shí)體,并設(shè)置已加載實(shí)體的導(dǎo)航屬性以引用新加載的實(shí)體。

3.1查詢關(guān)聯(lián)實(shí)體

可以獲得表示導(dǎo)航屬性內(nèi)容的LINQ查詢。

這使你可對(duì)查詢應(yīng)用其他運(yùn)算符。示例:

using (var context = new BloggingContext())
{
    var blog = context.Blogs
        .Single(b => b.BlogId == 1);
    var postCount = context.Entry(blog)
        .Collection(b => b.Posts)
        .Query()
        .Count();
}

還可以篩選要加載到內(nèi)存中的關(guān)聯(lián)實(shí)體。

using (var context = new BloggingContext())
{
    var blog = context.Blogs
        .Single(b => b.BlogId == 1);
    var goodPosts = context.Entry(blog)
        .Collection(b => b.Posts)
        .Query()
        .Where(p => p.Rating > 3)
        .ToList();
}

四、延時(shí)加載

使用延遲加載的最簡單方法是通過安裝Microsoft.EntityFrameworkCore.Proxies包,并通過調(diào)用UseLazyLoadingProxies來啟動(dòng)該包。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .UseLazyLoadingProxies()
        .UseSqlServer(myConnectionString);

或在使用 AddDbContext 時(shí):

.AddDbContext<BloggingContext>(
    b => b.UseLazyLoadingProxies()
          .UseSqlServer(myConnectionString));

EF Core將為可被重寫的任何導(dǎo)航屬性啟用延遲加載。

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Post> Posts { get; set; }
}

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public virtual Blog Blog { get; set; }
}

4.1 不使用代理進(jìn)行延遲加載

不使用代理進(jìn)行延遲加載的工作方式是將 ILazyLoader 注入到實(shí)體中,如實(shí)體類型構(gòu)造函數(shù)中所述。例如:

public class Blog
{
    private ICollection<Post> _posts;

    public Blog()
    {
    }

    private Blog(ILazyLoader lazyLoader)
    {
        LazyLoader = lazyLoader;
    }

    private ILazyLoader LazyLoader { get; set; }

    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<Post> Posts
    {
        get => LazyLoader.Load(this, ref _posts);
        set => _posts = value;
    }
}

public class Post
{
    private Blog _blog;

    public Post()
    {
    }

    private Post(ILazyLoader lazyLoader)
    {
        LazyLoader = lazyLoader;
    }

    private ILazyLoader LazyLoader { get; set; }

    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public Blog Blog
    {
        get => LazyLoader.Load(this, ref _blog);
        set => _blog = value;
    }
}

此方法不要求實(shí)體類型為可繼承的類型,也不要求導(dǎo)航屬性必須是虛擬的,且允許通過new創(chuàng)建的實(shí)體實(shí)例在附加到上下文后可進(jìn)行延遲加載。但它需要對(duì)Microsoft.EntityFrameworkCore.Abstractions包中定義的ILazyLoader服務(wù)的引用。此包包含所允許的最少的一組類型,以便將依賴此包時(shí)所產(chǎn)生的影響將到最低。不過,可以將ILazyLoader.Load方法以委托的形式注入,這樣就可以完全避免依賴于實(shí)體類型的任何EF Core包。

public class Blog
{
    private ICollection<Post> _posts;

    public Blog()
    {
    }

    private Blog(Action<object, string> lazyLoader)
    {
        LazyLoader = lazyLoader;
    }

    private Action<object, string> LazyLoader { get; set; }

    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<Post> Posts
    {
        get => LazyLoader.Load(this, ref _posts);
        set => _posts = value;
    }
}

public class Post
{
    private Blog _blog;

    public Post()
    {
    }

    private Post(Action<object, string> lazyLoader)
    {
        LazyLoader = lazyLoader;
    }

    private Action<object, string> LazyLoader { get; set; }

    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public Blog Blog
    {
        get => LazyLoader.Load(this, ref _blog);
        set => _blog = value;
    }
}

上述代碼使用 Load 擴(kuò)展方法,以便更干凈地使用委托:文章來源地址http://www.zghlxwxcb.cn/news/detail-853985.html

public static class PocoLoadingExtensions
{
    public static TRelated Load<TRelated>(
        this Action<object, string> loader,
        object entity,
        ref TRelated navigationField,
        [CallerMemberName] string navigationName = null)
        where TRelated : class
    {
        loader?.Invoke(entity, navigationName);

        return navigationField;
    }
}

到了這里,關(guān)于【Entity Framework】你必須要了解EF中數(shù)據(jù)查詢之?dāng)?shù)據(jù)加載的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • AI繪畫你必須要知道5個(gè)tag進(jìn)階用法

    AI繪畫你必須要知道5個(gè)tag進(jìn)階用法

    哈嘍,大家好,我是阿宅,最近AI繪畫也是很火,阿宅這幾天也是靜下心來好好研究了一下這個(gè)東西,確實(shí)好用啊,總所周知啊,這些前沿技術(shù)一直都是大廠來開拓和引導(dǎo)的,這不已經(jīng)有消息說,某某大廠已經(jīng)基于AI做好了一套完整的商業(yè)化流程了。 ????????不管是小白還

    2023年04月15日
    瀏覽(24)
  • 初入mac電腦,你必須要知道這10款裝機(jī)必備的寶藏軟件

    初入mac電腦,你必須要知道這10款裝機(jī)必備的寶藏軟件

    初入mac電腦,不知道安裝什么mac軟件,這里整理了日常能給我工作和學(xué)習(xí)帶來效率的10款軟件分享給你們,個(gè)個(gè)都算得上是剛需,可以大大提高M(jìn)ac的使用體驗(yàn)! 1、Downie 4 Mac 平臺(tái)上非常好用的視頻下載工具,支持1000 多個(gè)不同的視頻網(wǎng)站,功能強(qiáng)大使用簡單。 2、Magnet 這是一款

    2024年02月04日
    瀏覽(23)
  • 進(jìn)階--AI繪畫里你必須要直到的controlnet模型使用方法

    進(jìn)階--AI繪畫里你必須要直到的controlnet模型使用方法

    哈嘍,各位小伙伴們大家好,有一段時(shí)間沒有更新了,最近也是忙著搬家忙著置辦家具等等,今天終于得空,于是乎連忙抽空做了這期關(guān)于controlnet的使用教程。 因?yàn)樽罱乙彩前l(fā)現(xiàn),controlnet對(duì)于AI繪畫來說可真是太重要了,說白了,這個(gè)插件用好了,將會(huì)大大的提升我們的

    2024年02月04日
    瀏覽(34)
  • CSS基礎(chǔ):你必須要知道的行高屬性 line-height

    CSS基礎(chǔ):你必須要知道的行高屬性 line-height

    作者: WangMin 格言: 努力做好自己喜歡的每一件事 對(duì)于初學(xué)CSS的同學(xué)來說,會(huì)有很多屬性相關(guān)的疑問,行高屬性 line-height一定是其中一個(gè),因?yàn)樗荂SS中非常重要的一個(gè)屬性,這個(gè)屬性改變?cè)卦诰W(wǎng)頁中的行高,讓你的網(wǎng)頁看起來更加整潔,美觀。 什么是行高? CSS中的行高(

    2024年02月05日
    瀏覽(25)
  • 【C# .NET 】使用 Entity Framework Core 操作sqlite數(shù)據(jù)庫

    添加包 EF Core design package? ?NuGet Gallery | Home 使用用于?EF Core 遷移和現(xiàn)有數(shù)據(jù)庫中的反向工程(基架)的工具需要安裝相應(yīng)的工具包: 可在 Visual Studio?包管理器控制臺(tái)中使用的 PowerShell 工具的?Microsoft.EntityFrameworkCore.Tools 跨平臺(tái)命令行工具的?dotnet-ef?和?Microsoft.EntityFramewor

    2024年02月14日
    瀏覽(25)
  • .Net Core Entity Framework Core 的基礎(chǔ)封裝 -數(shù)據(jù)庫操作攔截器

    .Net Core Entity Framework Core 的基礎(chǔ)封裝 -數(shù)據(jù)庫操作攔截器

    自己制作的一個(gè)基于Entity Framework Core 的數(shù)據(jù)庫操作攔截器,可以打印數(shù)據(jù)庫執(zhí)行sql,方便開發(fā)調(diào)試,代碼如下: 運(yùn)行結(jié)果如下: ?

    2024年02月22日
    瀏覽(35)
  • C#:了解LINQ,簡化數(shù)據(jù)查詢和操作的強(qiáng)大工具

    C#:了解LINQ,簡化數(shù)據(jù)查詢和操作的強(qiáng)大工具

    以下是 LINQ(Language Integrated Query)中常見的及其作用,并給出一個(gè)示例以展示其執(zhí)行結(jié)果: from :用于指定數(shù)據(jù)源,可以是集合、數(shù)組、數(shù)據(jù)庫表等。 示例: where :用于篩選滿足指定條件的元素。 示例: select :用于選擇返回的結(jié)果集。 示例: orderby :用于對(duì)結(jié)果集

    2024年02月12日
    瀏覽(30)
  • 【Mysql】一篇帶你了解數(shù)據(jù)定義,操作和查詢語言

    【Mysql】一篇帶你了解數(shù)據(jù)定義,操作和查詢語言

    目錄 數(shù)據(jù)定義語言DDL(Data Definition Language) 一.對(duì)數(shù)據(jù)庫的操作 二.對(duì)數(shù)據(jù)表的操作 數(shù)據(jù)操作語言DML(Data Manipulation Language) 一.添加 insert into 二.刪除? delete 三.修改? update 數(shù)據(jù)查詢語言DQL(Data Query Language) 一.查詢 select 二. 1.between ... and ...(在....之間) 2.in, exists

    2024年02月12日
    瀏覽(22)
  • Entity Framework的最佳實(shí)踐一

    Entity Framework的最佳實(shí)踐一

    Entity Framework (EF) Core 是輕量化、可擴(kuò)展、 開源 和跨平臺(tái)版的常用 Entity Framework 數(shù)據(jù)訪問技術(shù)。 EF Core 可用作對(duì)象關(guān)系映射程序 (O/RM) EF Core API鏈接 Github地址 ? DbContext?的生存期從創(chuàng)建實(shí)例時(shí)開始,并在 釋放 實(shí)例時(shí)結(jié)束。 通過依賴關(guān)系 為每個(gè)請(qǐng)求創(chuàng)建一個(gè)?ApplicationDbContext?

    2024年02月06日
    瀏覽(20)
  • Entity Framework Core 大小寫敏感處理

    可以使用\\\'StringComparison\\\'嗎? 在數(shù)據(jù)庫查詢操作中,不可避免去考慮字母大小寫的問題,比如要在Movie表中查找“X-Men”這部電影,為了不區(qū)分字母大小寫,按照Linq to memory的習(xí)慣,可能會(huì)寫出如下代碼: 但是上述代碼執(zhí)行會(huì)報(bào)錯(cuò),提示?\\\'StringComparison\\\'參數(shù)不支持。 怎么解決這

    2023年04月13日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包