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

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

时间:2024-05-28 16:36:29浏览次数:16  
标签:Core author EF 查询 加载 导航 属性

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

Include:

Include 是 Entity Framework Core (EF Core) 中的一个方法,用于指定在查询中预先加载相关的导航属性。

在 EF Core 中,导航属性表示实体类之间的关联关系。通过导航属性,我们可以轻松地在查询中访问和检索相关联的实体数据。但是,默认情况下,在查询实体时,EF Core 只会加载主实体,而不会自动加载相关的导航属性。这种情况下,如果我们想要获取相关联的实体数据,就需要使用 Include 方法来显式地指定要预加载的导航属性。

Include 方法接受一个 lambda 表达式作为参数,用于指定要包含的导航属性。这样,当执行查询时,EF Core 将会自动构造相应的 SQL 查询语句,同时加载指定的导航属性的数据。

以下是一个使用 Include 方法的示例代码:

using Microsoft.EntityFrameworkCore;

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

// 查询特定作者的所有书籍,并同时加载书籍的详细信息
var authorWithBooks = dbContext.Authors
    .Include(author => author.Books) // 指定要包含的导航属性
    .FirstOrDefault(author => author.AuthorId == 1);

在上面的示例中,我们通过 Include 方法指定了要加载的导航属性 Books,它表示 Author 实体与 Book 实体之间的关联关系。这样,当执行查询时,EF Core 将会加载特定作者的所有书籍,并将其赋值给 authorWithBooks 变量。

需要注意的是,使用 Include 方法来预先加载导航属性的数据可以避免产生额外的数据库查询,从而提高查询的性能。但是,当导航属性的层次较深或者有多个导航属性时,我们需要谨慎使用 Include 方法,以避免加载过多的数据和影响性能。在这种情况下,我们可能需要考虑使用其他加载策略,如延迟加载或显式加载,来实现更精确的数据加载。

注解:

当我们使用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; // 直接访问导航属性,无需再次查询数据库
    JAVASCRIPT 复制 全屏
  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查询语句,以获取相关联的实体数据。因此,我们需要根据具体业务需求和性能考量,选择合适的加载策略来优化导航查询的性能。同时,也需要避免产生额外的数据库查询,以避免对数据库服务器造成过大的负载。

标签:Core,author,EF,查询,加载,导航,属性
From: https://www.cnblogs.com/Alex80/p/18218314

相关文章

  • 9. 子查询练习题
    1.查询和Zlotkey相同部门的员工姓名和工资selectfirst_name,last_name,salaryfromemployeesewheredepartment_id=(selectdepartment_id fromemployeese2 wherelast_name='Zlotkey' );2.查询工资比公司平均工资高的员工的员工号,姓名和工......
  • Mybatis的mapper文件模糊查询TDengine数据库
    在mapper文件中使用#{}时会自动添加单引号,无法拼接使用%进行模糊查询,可以使用<bind>标签。MyBatis的标签用于创建一个新的变量,并将其绑定到上下文中。这通常用于创建复杂的SQL片段,这些片段可能包含从多个参数中组合而成的值。以下是<bind>标签的一个简单示例:<selectid="......
  • 【子域收集】OneForAll v0.4.5
    #简介OneForAll是一款功能强大的子域收集工具,该工具解决了同类工具不够强大、不够友好、效率问题等痛点,从而打造了一款简单易用强大的子域名收集工具。#软件截图#工具使用快速使用查看命令帮助python3oneforall.py-h对example.com域名进行子域名挖掘python3one......
  • DefaultListableBeanFactory+ GenericBeanDefinition
    定义与用途:GenericBeanDefinition:它是Spring框架中用于定义通用Bean的一个类。它继承自抽象类AbstractBeanDefinition,并增加了一个成员属性parentName。这个类主要用于存储Bean的配置信息,包括Bean的类名、作用域、属性等。DefaultListableBeanFactory:它是SpringIoC容器的一个......
  • 顶刊IJCV 2024 | EfficientSCI++:高效的视频单曝光压缩成像重建框架
    前言 来自浙江大学和西湖大学的研究人员提出了一种基于CNN-Transformer架构的高效、大尺度视频单曝光压缩成像重建算法EfficientSCI++。欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。本文转载自PaperWeekly仅用于学术分......
  • watch vs. watchEffect​
    watch和watchEffect都能响应式地执行有副作用的回调。它们之间的主要区别是追踪响应式依赖的方式:watch只追踪明确侦听的数据源。它不会追踪任何在回调中访问到的东西。另外,仅在数据源确实改变时才会触发回调。watch会避免在发生副作用时追踪依赖,因此,我们能更加精确地控制回......
  • Codeforces Round 948 (Div. 2)
    A.LittleNikita题意:\(n\)步操作,\(+1\)或\(-1\),最终结果是否等于\(m\)思路:设\(+1\)的操作次数为\(x\),\(-1\)的操作次数为\(y\)\[x+y=n\\x-y=m\]\[x=(n+m)/2\\y=(n-m)/2\]\((n-m)\)和\((n+m)\)均为偶数,即\(n\)和\(m\)均为偶数或同为奇数,且\(n>=m\)代码:voidsolve()......
  • PreviewMouseLeftButtonDown与MouseLeftButtonDown的撕烤
    在WPF(WindowsPresentationFoundation)中,PreviewMouseLeftButtonDown和MouseLeftButtonDown是两个常用的鼠标事件,它们在事件路由策略和处理时机上有所不同。了解这两个事件的区别以及如何在实际应用中使用它们,可以帮助开发者更好地处理用户交互。事件的基本区别PreviewMouseL......
  • 小易大数据:大数据报告查询领域的黑马,这些优势让你无法忽视!
    随着大数据技术被运用到各行各业,风控领域也不例外,形成了基于大数据技术的大数据信用,也就是我们常说的大数据报告或者网贷大数据,在众多的查询平台中,小易大数据平台在市面上是比较受欢迎的,那在小易平台查大数据报告有哪些优势呢?本文带你了解一下。小易大数据在市面上......
  • SQLServer如何查询近3分钟最消耗CPU的SQL
    在SQLServer中,要查询近3分钟最消耗CPU的SQL语句,可以使用sys.dm_exec_query_stats动态管理视图结合sys.dm_exec_sql_text函数来获取SQL语句的文本。不过,直接查询近3分钟的数据可能需要一些额外的逻辑来筛选时间范围,因为sys.dm_exec_query_stats并不直接提供时间筛选的功能。一种......