系列目錄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));
建議儘可能使用鏈接池方式鏈接數據庫。