按部就班学.Net Core Web Api开发系列【9】:经常使用的数据库操做

系列目录html

按部就班学.Net Core Web Api开发系列目录git

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

 

1、概述sql

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


2、条件查询
一、查询全部记录json

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

 

二、根据主键进行查询app

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

 

三、根据非主键信息字段进行查询性能

List<Product> products = _context.Products

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

  .ToList<Product>();

 若是找不到会返回Null,但不报异常。ui

 

四、查询一条记录spa

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

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

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

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

 

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

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中的日志级别就能够了。


3、排序

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

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

 

4、 预先加载
可使用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>();

 

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

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

 

6、原始的 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 注入式攻击

 

7、分页

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

 

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

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

  

二、更新数据

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

 

三、删除数据

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

 

四、在单个 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是事务性的,以上代码不须要额外增长任何事务性代码。

 

9、 使用链接池

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

 建议尽可能使用链接池方式链接数据库。

相关文章
相关标签/搜索