系列目录

循序渐进学.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 > )
  .OrderByDescending(b => b.Rating)
  .ToList();

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

七、分页

int pageSize = ;
int pageNumber = ;
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));

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

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

  1. 循序渐进学.Net Core Web Api开发系列【0】:序言与目录

    一.序言 我大约在2003年时候开始接触到.NET,最初在.NET framework 1.1版本下写过代码,曾经做过WinForm和ASP.NET开发.大约在2010年的时候转型JAVA环境,这么多 ...

  2. 循序渐进学.Net Core Web Api开发系列【16】:应用安全续-加密与解密

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 应用安全除 ...

  3. 循序渐进学.Net Core Web Api开发系列【15】:应用安全

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍W ...

  4. 循序渐进学.Net Core Web Api开发系列【14】:异常处理

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍异 ...

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

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍如 ...

  6. 循序渐进学.Net Core Web Api开发系列【12】:缓存

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍如 ...

  7. 循序渐进学.Net Core Web Api开发系列【11】:依赖注入

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍如 ...

  8. 循序渐进学.Net Core Web Api开发系列【10】:使用日志

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.本篇概述 本篇介 ...

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

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇讨论如 ...

随机推荐

  1. AdaBoost原理详解

    写一点自己理解的AdaBoost,然后再贴上面试过程中被问到的相关问题.按照以下目录展开. 当然,也可以去我的博客上看 Boosting提升算法 AdaBoost 原理理解 实例 算法流程 公式推导 ...

  2. sqoop的安装与配置

    最近需要将MySQL的数据导出到HDFS,所以搜到了sqoop2.跟sqoop1相比,sqoop2的好处是直接使用程序连接到集群上的sqoop,远程操作.流程是需要先创建link也可以理解成要操作的对 ...

  3. map文件的使用

    map文件相信大家并不陌生,大家都知道是用来调试的,但是具体怎么用你又清不清楚呢? 其实也很简单 1.拿JQ为例,我们需要备有jquery.js.jquery.min.js.jquery.min.ma ...

  4. 介绍C++11标准的变长参数模板

    目前大部分主流编译器的最新版本均支持了C++11标准(官方名为ISO/IEC14882:2011)大部分的语法特性,其中比较难理解的新语法特性可能要属变长参数模板(variadic template) ...

  5. linux系统root密码忘了怎么办 三种方法快速找回root密码

    linux root密码找回方法一 第1步:在系统进入单用户状态,直接用passwd root去更改. 第2步:用安装光盘引导系统,进行linux rescue状态,将原来/分区挂接上来,作法如下: ...

  6. JVM内存管理---垃圾收集器

    说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物.事实上,GC的历史远比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态 ...

  7. bzoj千题计划213:bzoj2660: [Beijing wc2012]最多的方案

    http://www.lydsy.com/JudgeOnline/problem.php?id=2660 很容易想到是先把n表示成最大的两个斐波那契数相加,然后再拆分这两个斐波那契数 把数表示成斐波那 ...

  8. LVS原理详解(3种工作模式及8种调度算法)

    2017年1月12日, 星期四 LVS原理详解(3种工作模式及8种调度算法)   LVS原理详解及部署之二:LVS原理详解(3种工作方式8种调度算法) 作者:woshiliwentong  发布日期: ...

  9. python学习笔记6--操作redis

    一.redis操作 import redis r=redis.Redis(host='211.149.218.16',port=6379,password='123456',db=2) r.set(' ...

  10. Apache Oozie Coordinator 作业自定义配置定时任务

    一,介绍 Oozie是Hadoop的工作流系统,如果使用Oozie来提交MapReduce作业(Oozie 不仅仅支持MapReduce作业,还支持其他类型的作业),可以借助Oozie Coordin ...