查询数据
Entity Framework(EF) Core 使用语言集成查询 (LINQ) 来查询数据库中的数据。 通过 LINQ 可使用 C# (或你选择的其
他 .NET 语言)基于派生上下文和实体类编写强类型查询。 LINQ 查询的一种表示形式会传递给数据库提供程序,进
而转换为特定于数据库的查询语言(例如,适用于关系数据库的 SQL )。有关 LINQ 的示例可参阅 101 LINQ Samples。
调用 LINQ 运算符时,只会构建查询在内存中的表示形式。 只有在使用结果时,查询才会发送到数据库。导致查询发送到数据库的最常见操作如下:
-
在 for 循环中循环访问结果
-
使用 ToList 、 ToArray 、 Single 、 Count 等操作
-
将查询结果数据绑定到 UI
通过 LINQ 可加载单个实体,使用导航属性来加载关联数据。也支持自定义查询结果。
在无法使用 LINQ 表达要执行的
查询或低效时,还可以使用原生 SQL 语句。
同样的,有关查询的内容也挺多,可以快速浏览一遍,遇到模糊的就敲代码运行一次,让自己有一个直观的理解,并记住这一章的主要内容,当在实践应用时再通过看文档的详细信息。
示例
在学习或开发模式中,日志输出的 SQL 语句参数可设为可见options.EnableSensitiveDataLogging(true);
,这样方便调试理解。
在查询中参数应该设置为变量,否则是字面值的话发送到数据库的语句也是字面值,而不是参数。
加载所有数据
using (var context = new BloggingContext())
{
var blogs = context.Blogs.ToList();
}
加载单个实体
int blogId = 1; // 变量
using (var context = new BloggingContext())
{
var blog = context.Blogs
.Single(b => b.BlogId == blogId);
}
筛选
using (var context = new BloggingContext())
{
var blogs = context.Blogs
.Where(b => b.Url.Contains("dotnet")) // 字面值
.ToList();
}
加载关联数据
可以使用 Include 方法来指定要包含在查询结果中的关联数据。使用 ThenInclude 方法可以依循关系包含多个层级的关联数据。
using (var context = new BloggingContext())
{
var blogs = context.Blogs
.Include(blog => blog.Posts)
.ThenInclude(post => post.Author)
.ToList();
}
自定义查询结果
List<dynamic> viewBlogs = context.Blogs
.OrderByDescending(blog => blog.Rating)
.Select(blog => new
{
Id = blog.BlogId,
Url = StandardizeUrl(blog.Url)
})
.ToList();
原生 SQL 语句
var blogs = context.Blogs
.FromSql("SELECT * FROM dbo.Blogs")
.ToList();
网友评论