前面章节我们学习了如何定义关联模型,得益于C#强大的LINQ语法,EFCore中的关联查询其实也很容易编写,这里我们学习如何使用EFCore实现关联查询。
下面例子在Author
和Book
的多对多关系中,查询某个作者的所有书籍。
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();
当然这种写法就很繁琐了,这里只是作为一个例子。