循序渐进学.Net Core Web Api开发系列【9】:常用的数据库操作

系列目录

循序渐进学.Net Core Web Api开发系列目录

本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi

一、概述

本篇描述一些常用的数据库操作,包括:条件查询、排序、分页、事务等基本数据库操作。试验的数据库为MySQL。

二、条件查询
1、查询所有记录

List<Article> articles = _context.Articles.ToList<Article>();

2、根据主键进行查询

Article article = _context.Articles.Find(id);

3、根据非主键信息字段进行查询

List<Product> products = _context.Products

  .Where(p => p.Name == name)

  .ToList<Product>();

如果找不到会返回Null,但不报异常。

4、查询一条记录

Article articles = _context.Articles
    .Single(article=>article.Title==title);

此时应要求该字段做唯一性约束,该方法期待必须返回一条记录,0条和多条都会报异常。

而First方法会取众多记录中的第一条,如果找不到会报异常,但有多条符合条件就取一条不报异常。

Article articles = _context.Articles
    .First(article=>article.Title.Contains(title));

5、模糊查询
模糊查询有两种方法:

List<Article> articles = _context.Articles
  .Where(article => article.Title.Contains(title))
  .ToList();

List<Article> articles = _context.Articles
  .Where(article => EF.Functions.Like(article.Title,$"{title}%"))
  .ToList();

Like方法和String的Contains方法都能实现模糊查询,主要区别在于:EF.Functions.Like()方法支持通配符,而StartsWith、Contains和EndsWith方法是不支持通配符的,比较下面两个方法,第1条语句可以实现预期效果,但第2条语句不行。

(1) EF.Functions.Like(article.Title,“%[a-z]%”)

(2) article.Title.Contains("[a-z]")

提示:如果需要查看实际执行的SQL语句,修改application.json中的日志级别就可以了。


三、排序

List<Article> articles = _context
    .Articles.OrderBy(article=>article.Title)
    .ToList<Article>();

List<Article> articles = _context
  .Articles.OrderByDescending(article=>article.Title)
  .ToList<Article>();

四、 预先加载
可以使用Include方法,以便指定要包含在查询结果的相关的数据。

Article article = _context.Articles
  .Include(a => a.author)
  .First();

上述代码中article的author属性不再为null。

加载多项

var blogs = context.Blogs
  .Include(blog => blog.Posts)
  .Include(blog => blog.Owner)
  .ToList();

多级预加载:

List<Column> columns = _context.Columns
  .Include(column => column.Articles)
  .ThenInclude(article=> article.author)
  .ToList<Column>();

五、非跟踪查询(No-tracking queries)
如果仅仅是只读查询,采用非跟踪查询会提供查询的性能。

List<Article> articles = _context.Articles
  .AsNoTracking()
  .ToList<Article>();

六、原始的 SQL 查询
可以使用FromSql扩展方法,实现基于原始的 SQL 查询的 LINQ 查询。

List<Article> articles = _context.Articles
  .FromSql("select * from cms_article")
  .ToList();

也可以使用原始的 SQL 查询来执行存储的过程。

var blogs = context.Blogs
  .FromSql("EXECUTE dbo.GetMostPopularBlogs")
  .ToList();

或者实现带参数的查询

var sql = $"select * from cms_article where title like ‘%{titlewithsql}%‘";
List<Article> articles = _context.Articles
  .FromSql(sql)
  .ToList();

预加载Include、Where 与OrderBy都可以使用

List<Article> articles = _context.Articles
  .FromSql(sql)
  .Include(a=>a.author)
  .ToList();

var searchTerm = ".NET";
var blogs = context.Blogs
  .FromSql($"SELECT * FROM dbo.SearchBlogs({searchTerm})")
  .Where(b => b.Rating > 3)
  .OrderByDescending(b => b.Rating)
  .ToList();

注意:如果使用字符串串联来动态生成的查询字符串的任何部分,则你将负责验证任何输入,以防止受到 SQL 注入式攻击

七、分页

int pageSize = 10;
int pageNumber = 2;
List<Article> articles = _context.Articles
  .AsNoTracking()
  .Skip(pageSize* pageNumber)
  .Take(pageSize)
  .ToList<Article>();

八、修改数据
1、添加数据
使用DbSet.Add方法将添加的实体类的新实例。

var blog = new Blog { Url = "http://sample.com" };
context.Blogs.Add(blog);
context.SaveChanges();

2、更新数据

var blog = context.Blogs.Find("xx");
blog.Url = "http://sample.com/blog";
context.SaveChanges();

3、删除数据

var blog = context.Blogs.First();
context.Blogs.Remove(blog);
context.SaveChanges();

4、在单个 SaveChanges 的多个操作

context.Blogs.Add(new Blog { Url = "http://sample.com/blog_one" });
context.Blogs.Add(new Blog { Url = "http://sample.com/blog_two" });

// update
var firstBlog = context.Blogs.First();
firstBlog.Url = "";

// remove
var lastBlog = context.Blogs.Last();
context.Blogs.Remove(lastBlog);

context.SaveChanges();

SaveChanges是事务性的,以上代码不需要额外增加任何事务性代码。

九、 使用连接池

String connStr = Configuration.GetConnectionString("MySQLConnection");
services.AddDbContextPool<SalesContext>(builder=> builder.UseMySQL(connStr));

建议尽量使用连接池方式连接数据库。

原文地址:https://www.cnblogs.com/seabluescn/p/9274516.html

时间: 07-07

循序渐进学.Net Core Web Api开发系列【9】:常用的数据库操作的相关文章

循序渐进学.Net Core Web Api开发系列【8】:访问数据库(基本功能)

系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇讨论如何连接数据库,包括连接SQL Server 和 连接MySQL,然后做一些基本的数据操作. 二.连接SQL Server 首先通过NuGet添加相关的包: 新建一个实体类: public class Product { [Key] public string Code { get; set; } p

循序渐进学.Net Core Web Api开发系列【13】:中间件(Middleware)

系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍如何使用中间件(Middleware). 二.初步演练 先写几个中间件 public class DemoAMiddleware { private readonly RequestDelegate _next; private readonly ILogger _logger; public Dem

循序渐进学.Net Core Web Api开发系列【1】:开发环境

系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.本篇概述 本篇不打算描述如何通过Visual Studio创建一个项目之类的话题,主要描述以下内容: 1.使用NuGet和Bower引入第三方库 2.Linux下安装运行环境 3.关于安装虚拟机时碰到的网络设置的问题 实验环境:Windows 10 ,Visual Studio 2017 ,VM 14 , Cent

ASP.NET Core Web API 开发-RESTful API实现

REST 介绍: 符合REST设计风格的Web API称为RESTful API. 具象状态传输(英文:Representational State Transfer,简称REST)是Roy Thomas Fielding博士于2000年在他的博士论文 "Architectural Styles and the Design of Network-based Software Architectures" 中提出来的一种万维网软件架构风格. 目前在三种主流的Web服务实现方案中,因为R

在Mac下创建ASP.NET Core Web API

在Mac下创建ASP.NET Core Web API 在Mac下创建ASP.NET Core Web API 这系列文章是参考了.NET Core文档和源码,可能有人要问,直接看官方的英文文档不就可以了吗,为什么还要写这些文章呢? 原因如下: 官方文档涉及的内容相当全面,属于那种大而全的知识仓库,不太适合初学者,很容易让人失去重要,让人掉入到具体的细节之中. 对于大多数人来讲开发语言只是工具,程序员都有一个通病,就是死磕工具,把工具学深.我认为在工具上没有必要投入太多时间,以能高效地完成日常的

ASP.NET Core Web API下事件驱动型架构的实现(一):一个简单的实现

很长一段时间以来,我都在思考如何在ASP.NET Core的框架下,实现一套完整的事件驱动型架构.这个问题看上去有点大,其实主要目标是为了实现一个基于ASP.NET Core的微服务,它能够非常简单地订阅来自于某个渠道的事件消息,并对接收到的消息进行处理,于此同时,它还能够向该渠道发送事件消息,以便订阅该事件消息的消费者能够对消息数据做进一步处理.让我们回顾一下微服务之间通信的几种方式,分为同步和异步两种.同步通信最常见的就是RESTful API,而且非常简单轻量,一个Request/Resp

ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理

在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很长的路要走.今天,我们就研究一下在事件处理器中,对象生命周期的管理问题. 事实上,不仅仅是在事件处理器中,我们需要关心对象的生命周期,在整个ASP.NET Core Web API的应用程序里,我们需要理解并仔细推敲被注册到IoC容器中的服务,它们的生命周期应该是个怎样的情形,这也是服务端应用程序设

ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目

 一.前言 这几年前端的发展速度就像坐上了火箭,各种的框架一个接一个的出现,需要学习的东西越来越多,分工也越来越细,作为一个 .NET Web 程序猿,多了解了解行业的发展,让自己扩展出新的技能树,对自己的职业发展还是很有帮助的.毕竟,现在都快到9102年了,如果你还是只会 Web Form,或许还是能找到很多的工作机会,可是,这真的不再适应未来的发展了.如果你准备继续在 .NET 平台下进行开发,适时开始拥抱开源,拥抱 ASP.NET Core,即使,现在工作中可能用不到. 雪崩发生时,没有一

asp.net core web api token验证和RestSharp访问

对与asp.net core web api验证,多种方式,本例子的方式采用的是李争的<微软开源跨平台移动开发实践>中的token验证方式. Asp.net core web api项目代码: 首先定义三个Token相关的类,一个Token实体类,一个TokenProvider类,一个TokenProviderOptions类 代码如下: /// <summary> /// Token实体 /// </summary> public class TokenEntity