首页 > 其他分享 >SslSugar导航查询与EF Core导航查询

SslSugar导航查询与EF Core导航查询

时间:2023-12-18 10:22:21浏览次数:31  
标签:author EF 查询 属性 导航 public 加载

SqlSugar:

当我们在SQLSugar中定义了两个实体类之间的关联关系时,可以使用导航属性进行关联查询。导航属性是表示一个实体对象与其他实体对象之间关联的属性。通过导航属性,我们可以方便地在查询中访问和检索相关联的实体数据。

在SQLSugar中,导航属性需要满足以下条件:

  • 导航属性必须为可访问的公共属性(Public)。
  • 导航属性的类型必须是另一个实体类或实体类集合。

下面我们以作者(Author)和书籍(Book)为例进行说明。假设我们有以下的实体类定义:

public class Author
{
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int AuthorId { get; set; }
    public string Name { get; set; }

    [SugarColumn(IsIgnore = true)]
    public List<Book> Books { get; set; }
}

public class Book
{
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int BookId { get; set; }
    public string Title { get; set; }
    public int AuthorId { get; set; }

    [SugarColumn(IsIgnore = true)]
    public Author Author { get; set; }
}

在示例中,作者(Author)类包含了一个导航属性Books,它用于表示一个作者可以拥有多本书。而书籍(Book)类包含了一个导航属性Author,它用于表示一本书只能有一个作者。

接下来,我们可以使用导航属性进行查询的示例代码:

using SqlSugar;

// 创建SqlSugarClient对象
var db = new SqlSugarClient(new ConnectionConfig()
{
    ConnectionString = "YourConnectionString",
    DbType = DbType.SqlServer,
    IsAutoCloseConnection = true
});

// 查询特定作者的所有书籍
var authorWithBooks = db.Queryable<Author>()
    .Where(author => author.AuthorId == 1)
    .Mapper(c => c.Books, c =>
    {
        c.Books = db.Queryable<Book>().Where(book => book.AuthorId == c.AuthorId).ToList();
    })
    .First();

// 查询特定书籍的作者信息
var bookWithAuthor = db.Queryable<Book>()
    .Where(book => book.BookId == 1)
    .Mapper(c => c.Author, c =>
    {
        c.Author = db.Queryable<Author>().Where(author => author.AuthorId == c.AuthorId).First();
    })
    .First();

在以上示例中,我们使用了Queryable方法来进行查询操作,并通过Mapper方法来加载关联的实体数据。

对于查询特定作者的所有书籍的例子,我们首先使用Queryable<Author>来查询作者表,并指定了一个条件author => author.AuthorId == 1。然后,使用Mapper方法来映射导航属性Books的查询结果。在这个例子中,我们使用db.Queryable<Book>().Where(book => book.AuthorId == c.AuthorId).ToList()来加载作者的所有书籍,并将结果赋值给导航属性c.Books

对于查询特定书籍的作者信息的例子,我们首先使用Queryable<Book>来查询书籍表,并指定了一个条件book => book.BookId == 1。然后,使用Mapper方法来映射导航属性Author的查询结果。在这个例子中,我们使用db.Queryable<Author>().Where(author => author.AuthorId == c.AuthorId).First()来加载书籍的作者信息,并将结果赋值给导航属性c.Author

通过这种方式,我们可以方便地使用导航属性进行关联查询,从而获取相关实体之间的数据。导航查询能够简化代码逻辑,提高开发效率,并且使代码更加易读和可维护。

 

EF Core:

 

在Entity Framework (EF) Core中,导航查询是通过使用导航属性来实现关联查询的过程。EF Core提供了丰富的API和语法来支持导航属性的使用,使得进行关联查询变得非常便捷。

下面我将介绍一下在EF Core中如何进行导航查询的基本原理和示例代码。

基本原理

在EF Core中,我们可以定义实体类之间的关联关系,并在实体类中使用导航属性来表示这种关系。通过导航属性,我们可以轻松地在查询中访问和检索相关联的实体数据。

当我们执行导航查询时,EF Core会自动根据定义的关联关系和导航属性来构建相应的 SQL 查询语句,从而获取相关联的实体数据。

示例代码

假设我们有以下的实体类定义:作者(Author)和书籍(Book)。

public class Author
{
    public int AuthorId { get; set; }
    public string Name { get; set; }
    public List<Book> Books { get; set; }
}

public class Book
{
    public int BookId { get; set; }
    public string Title { get; set; }
    public int AuthorId { get; set; }
    public Author Author { get; set; }
}

接下来,我们可以使用导航属性进行查询的示例代码:

using Microsoft.EntityFrameworkCore;

// 创建DbContext对象
var dbContext = new YourDbContext();

// 查询特定作者的所有书籍
var authorWithBooks = dbContext.Authors
    .Include(author => author.Books)
    .FirstOrDefault(author => author.AuthorId == 1);

// 查询特定书籍的作者信息
var bookWithAuthor = dbContext.Books
    .Include(book => book.Author)
    .FirstOrDefault(book => book.BookId == 1);

在以上示例中,我们使用了EF Core中的Include方法来指定要包含的导航属性,以便在查询中加载相关联的实体数据。通过指定导航属性,我们可以轻松地实现关联查询的操作。

需要注意的是,在EF Core中,导航属性的加载策略对性能影响很大。通过Include方法可以指定要预先加载的导航属性,以避免产生额外的查询。此外,EF Core还提供了延迟加载等方式来动态加载导航属性的数据,以进一步优化查询性能。

总之,EF Core中的导航查询通过使用导航属性和相应的加载策略,使得关联查询变得非常便捷和灵活。开发人员可以根据具体的业务需求和性能考量,选择合适的加载策略来优化导航查询的性能。

注解:

当我们使用EF Core进行关联查询时,实际上是在查询主实体的同时,通过导航属性访问和获取相关联的实体数据。这种方式可以避免多次查询数据库,提高查询效率和性能。

在EF Core中,我们可以使用以下几种方式来进行导航查询:

  1. 延迟加载:当我们首次访问导航属性时,EF Core会自动异步地加载相关联的实体数据。这种方式不需要显式指定导航属性的加载策略,但可能会产生额外的数据库查询,影响性能。

    示例代码:

    // 延迟加载书籍
    var author = dbContext.Authors.FirstOrDefault(a => a.AuthorId == 1);
    var books = author.Books; // 第一次访问导航属性会自动异步加载相关联的书籍数据
  2. 预先加载:通过使用Include方法指定要预先加载的导航属性,可以在查询主实体时同时加载所有相关联的实体数据,从而避免产生额外的数据库查询。这种方式需要显式指定导航属性的加载策略。

    示例代码:

    // 预先加载书籍
    var authorWithBooks = dbContext.Authors.Include(author => author.Books).FirstOrDefault(a => a.AuthorId == 1);
    var books = authorWithBooks.Books; // 直接访问导航属性,无需再次查询数据库
  3. 显式加载:通过使用Load方法手动加载导航属性的数据,可以在查询主实体后,根据需要动态加载相关联的实体数据。

    示例代码:

    // 显式加载书籍
    var author = dbContext.Authors.FirstOrDefault(a => a.AuthorId == 1);
    dbContext.Entry(author).Collection(a => a.Books).Load(); // 手动加载导航属性的数据
    var books = author.Books; // 直接访问导航属性,无需再次查询数据库

需要注意的是,在进行导航查询时,EF Core会自动构建相应的SQL查询语句,以获取相关联的实体数据。因此,我们需要根据具体业务需求和性能考量,选择合适的加载策略来优化导航查询的性能。同时,也需要避免产生额外的数据库查询,以避免对数据库服务器造成过大的负载。

标签:author,EF,查询,属性,导航,public,加载
From: https://www.cnblogs.com/GaoUpUp/p/17910450.html

相关文章

  • React useEffect 在组件挂载时运行了两次
    在使用useEffect这个hook时,发现useEffect会执行2次useEffect(()=>{console.log("执行useEffect");},[]);控制台输出:执行useEffect执行useEffect查看疑难解答官方文档,官方解释如下:在开发环境下,如果开启严格模式,React会在实际运行setup之前额外运行一次......
  • win10 或者 win11 提示需要使用新应用以打开此 WindowsDefender 链接
    以管理员身份运行powershell在powershell界面输入以下命令:1、Set-ExecutionPolicyUnrestricted得到确认提示输入"y"2、Get-AppXPackage-AllUsers|Foreach{Add-AppxPackage-DisableDevelopmentMode-Register“$($_.InstallLocation)\AppXManifest.xml”}3、Get-AppxPac......
  • 解决k8s Get http://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252: connect: c
    安装完k8s集群之后很可能会出现一下情况:[root@master1~]#kubectlgetcsNAMESTATUSMESSAGEERRORschedulerUnhealthyGethttp://127.0.0.1:10251......
  • Educational Codeforces Round 159 (Rated for Div. 2)
    EducationalCodeforcesRound159(RatedforDiv.2)A-BinaryImbalance解题思路:有一对\((0,1)\),那么\(0\)就能无限增长。代码:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=2e5+10;typedefpair<ll,ll>pii;constllm......
  • Codeforces Round 915 (Div. 2)
    基本情况A题还没进入状态,卡了快10分钟。B题一开始想复杂了,以为是树的直径,后面推出来发现针对叶子数目讨论就行了,正确思路出来太慢了(一个半小时)。C题留了半个多小时,随便口胡了一个LIS思路,但是判断无解没思路。C.LargestSubsequenceProblem-C-Codeforces首先我们把字......
  • SNP Bluefield助力日日顺物流公司进行IT系统代码拆分
         日日顺是海尔集团旗下综合服务品牌,旗下有日日顺物流、日日顺乐家、日日顺乐农等。日日顺物流为家电、家具、卫浴等品类的厂商、线下零售商和电子商务客户提物流服务。日日顺网点遍布全国,深入县、乡、村级地区,日日顺的优势在于大件配送。2018年,日日顺品牌价值301.08......
  • mysql在使用myisam引擎的情况下如何提升查询速度
    MyISAM是MySQL的一种存储引擎,它在某些情况下可能比其他存储引擎(例如InnoDB)慢。但是,仍然有一些方法可以优化MyISAM表的查询速度:索引优化:为经常用于查询的列和WHERE子句中的列添加索引。使用复合索引来覆盖多个列,但要注意索引的列顺序。定期使用 OPTIMIZETABLE 命令来重新......
  • Educational Codeforces Round 134 (Rated for Div. 2)
    基本情况AB秒了。C搞了一个错的二分答案,虽然过样例了。C.Min-MaxArrayTransformation错误分析没有进一步推导性质,而是觉得数据单调递增估计是二分,然后就无脑写,实际上check的正确性没有保证。boolcheck(intind,intnow){ if(ind==now)returntrue; if(b[ind]......
  • Spring手动构建BeanDefinition的几种方法
    GenericBeanDefinitionRootBeanDefinitionChildBeanDefinitionBeanDefinitionBuilderGenericBeanDefinition@DatapublicclassStudent{Stringname;intage;}publicvoidtest(){AnnotationConfigApplicationContextcontext=newAnnotationConf......
  • Codeforces Round 867 (Div. 3)
    CodeforcesRound867(Div.3)A:ABCD(E差一点点,最后把那种特殊情况想出来然后没写上去就结束了)A.TubeTubeFeed题意:给两个数组分别是时间和价值,要价值最大但是只能选一个思路:最开始以为是01背包,结果只选一个,一个一个枚举就行#include<bits/stdc++.h>usingnamespace......