关联查询

前面章节我们学习了如何定义关联模型,得益于C#强大的LINQ语法,EFCore中的关联查询其实也很容易编写,这里我们学习如何使用EFCore实现关联查询。

查询关联对象

下面例子在AuthorBook的多对多关系中,查询某个作者的所有书籍。

using Microsoft.EntityFrameworkCore;

namespace Gacfox.Demo.DemoNetCore;

public class Program
{
    public static void Main()
    {
        using (MyDbContext myDbContext = new MyDbContext())
        {
            IQueryable<Author> result =
                (from author in myDbContext.Authors where author.AuthorName == "赵日天" select author)
                .Include(author => author.Books);
            foreach (Author author in result)
            {
                foreach (Book book in author.Books)
                {
                    Console.WriteLine($"{author.AuthorName} {book.BookName}");
                }
            }
        }
    }
}

上面代码其实非常直观,我们使用LINQ对myDbContext.Authors进行查询,该查询返回IQueryable对象,我们直接迭代输出其中的内容即可。注意我们使用了Include()方法,这是因为EFCore中关联的数据默认是不全部加载的,我们此处指定加载author.Books关联对象,这样我们才可以读取到关联的数据。

关联筛选

下面例子中,我们查询所有作者,要求这些作者写过包含某关键字的书籍。

namespace Gacfox.Demo.DemoNetCore;

public class Program
{
    public static void Main()
    {
        using (MyDbContext myDbContext = new MyDbContext())
        {
            IQueryable<Author> result =
                (from author in myDbContext.Authors
                    where author.Books.Any(b => b.BookName.Contains("母猪"))
                    select author);

            foreach (Author author in result)
            {
                Console.WriteLine($"{author.AuthorName}");
            }
        }
    }
}

这里我们使用了LINQ中的Any()操作,用于指定where的查询条件。

IQueryable是一个可以在其上多次级联查询的对象,换一种思路,该查询其实也可以如下编写LINQ语句。

IQueryable<Book> result1 = from book in myDbContext.Books where book.BookName.Contains("母猪") select book;
IQueryable<Author> result2 = (from book in result1 from author in book.Authors select author).Distinct();

当然这种写法就很繁琐了,这里只是作为一个例子。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap