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

摘要:
试验的数据库为MySQL。Articlearticles=_context.Articles.First;5、模糊查询模糊查询有两种方法:Listarticles=_context.Articles  .Where  .ToList();Listarticles=_context.Articles  .Where  .ToList();Like方法和String的Contains方法都能实现模糊查询,主要区别在于:EF.Functions.Like()方法支持通配符,而StartsWith、Contains和EndsWith方法是不支持通配符的,比较下面两个方法,第1条语句可以实现预期效果,但第2条语句不行。Listarticles=_context.Articles  .AsNoTracking()  .ToList();六、原始的SQL查询可以使用FromSql扩展方法,实现基于原始的SQL查询的LINQ查询。

系列目录

循序渐进学.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));

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

免责声明:文章转载自《循序渐进学.Net Core Web Api开发系列【9】:常用的数据库操作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JVM 源码分析(三):深入理解 CAS[Kotlin参考]一、总览-(1)服务器端Kotlin下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ASP.NET Core 四: Web核心与项目配置,静态内容(文件传输,npm包管理器),中间件,配置(环境配置,启动配置,用户密匙)

概念说明: web核心,本质是一个集成了为Http请求服务功能的承载(Host),一个请求(request)和对应的响应(response)都由HttpContext对象表示。因此就可以在服务的Run程序中对HttpContext的对象做出相关的操作(即对request和response做操作)。 静态内容,这里是关于如何返回静态文件,如html文件,或者...

ASP.NET网站入侵第二波(LeaRun.信息化快速开发框架 已被笔者拿下)

笔者小学文化,语言组织能力差,写的不通的地方请大家将就着看,不喜勿喷。     上篇我讲了如何在上传文件中入侵服务器,這次我们稍微多讲一点。    还是先讲下流程: 1、上传代码页面  我上传的是ashx页面。 2、用ashx页面已文本形式显示web.Config的内容 得到数据库连接, 3、用ashx在网站根目录输出vbs脚本(创建Windows账户脚本...

go-grpc 基本使用

gRPC是什么? gRPC是什么可以用官网的一句话来概括 A high-performance, open-source universal RPC framework 所谓RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从server/client模型。使用的时候客户端调用...

springboot 通过配置文件 控制Rabbitmq 启动

不哔哔,直接上代码 主要是 消费者添加配置 一,把配置放在配置中心(放在消费服务上也可以) listener.direct.auto-startup设置为false, 然后添加 rabbitmq.start 作为启动属性 spring: rabbitmq: host: 127.0.0.1 port: 5672 usernam...

安卓完全退出程序的六种方法

1. Dalvik VM的本地方法   //杀死进程android.os.Process.killProcess(android.os.Process.myPid())  //抛异常强制退出  System.exit(0);2.任务管理器方法  //通过activity管理器重启ActivityManager activitymanager= (Activ...

【aspnetcore】在过滤器(Filter)中使用注入服务(ServiceFilter|TypeFilter)

在MVC中,AOP是很常用的功能,我们经常会使用如 ActionFilter,IAuthorizeFilter 等描述对Controller和Action进行约束和扩展,一般做法如下: public class TestActionFilterAttribute : Attribute, IActionFilter { public voi...