本文章是根據 微軟MVP solenovex(楊旭)老師的視頻教程編寫而來,再加上本身的一些理解。
視頻教程地址:https://www.bilibili.com/video/BV1xa4y1v7rR
GitHub源碼:https://github.com/hllive/LearnEFCore3.1git
EFCore主要是經過Linq這個方式查詢數據庫github
把Leagues裏的全部數據查詢出來
第一種形式
經過Linq方法.ToList(),EFCore遇到ToList()語句就會執行SQL查詢,若是不加過濾條件的話就是把表裏的全部數據查詢出來
第二種形式
經過Linq查詢表達式,查詢結果與Linq方法是同樣的sql
[HttpGet] public IActionResult GetLeague() { //第一種形式 經過Linq方法 var leagues = _dbContext.Leagues.ToList(); //第二種形式 經過Linq查詢表達式 var league2 = (from lg in _dbContext.Leagues select lg).ToList(); return Ok(leagues); }
不加過濾條件查詢全部數據沒有什麼意義
須要加一些查詢條件
,查詢條件怎麼加呢?
第一種寫法
在後面加一個Where()方法,裏面的參數是一個Lambda表達式
第二種寫法
在後面加where語句,這與sql語句有點相似數據庫
[HttpGet] public IActionResult GetLeague() { //第一種 var leagues = _dbContext.Leagues .Where(l => l.Country == "中國")//查詢條件 .ToList();//只有執行ToList()方法才真正執行數據庫查詢 //第二種 var league2 = (from lg in _dbContext.Leagues where lg.Country == "中國"//查詢條件 select lg).ToList(); return Ok(leagues); }
一般在開發過程當中都是使用第一種方法c#
延遲執行
在.ToList()方法以前都是返回IQueryable類型異步
IQueryable就是C#中Linq To SQL語句的返回類型,簡單來講IQueryable就是能夠疊加處理SQL語句,最後統一訪問數據庫,這個處理過程就叫
延遲執行
,這一步只是生成了SQL語句,並無真正執行數據庫查詢ide
只有執行ToList()方法才真正執行數據庫查詢,這個ToList()方法以前都是能夠屢次疊加Where()方法
那麼在什麼狀況下會執行數據庫查詢呢?ui
ToList()
、First()
、FirstOrDefault()
Single()
、SingleOrDefault()
、Last()
、LastOrDefault()
//Single只能是一個數據
Count()
、LongCount()
、Min()
、Max()
、Average()
、Sum()
Find()
、foreach()
3d
還有異步版本:ToListAsync()
、FirstAsync()
First返回符合添加的第一條數據;First與FirstOrDefault的區別,First必須有數據,不然會報錯,FirstOrDefault無關緊要code
foreach循環:遇到foreach語句EFCore會把數據庫鏈接打開,而後鏈接一直處於開放狀態,一直保持鏈接,直至foreach循環結束才關閉數據庫鏈接,若是循環裏執行比較耗時,可能就會出現一些異常或數據衝突,儘可能不要這樣寫;應該先經過ToList(),而後對ToList的結果進行循環。
First()與FirstOrDefault()能夠在方法參數裏直接寫Where查詢條件
_dbContext.Leagues.FirstOrDefault(w => w.Country == "中國");
若是在代碼中把查詢條件寫死了,生成的SQL語句也是寫死的。若是把查詢條件提取爲變量,生成SQL語句就會使用參數類型
模糊查詢
好比須要模糊sql查詢條件
SELECT * FROM Leagues WHERE Country LIKE N'%中%'
//第一種 模糊查詢 var leagues = _dbContext.Leagues .Where(l => l.Country.Contains("中"))//查詢條件 .ToList(); //第二種 模糊查詢 var league_ef = _dbContext.Leagues .Where(l => EF.Functions.Like(l.Country, "中%")) .ToList();
[HttpGet] public IActionResult GetSingleLeague() { var _id = new Guid("4227506D-05E4-47A2-B94F-08D8451D5DC0"); //第一種 var leagues = _dbContext.Leagues.SingleOrDefault(l => l.Id == _id); //第二種 var league2 = _dbContext.Leagues.Find(_id); return Ok(new { leagues, league2 }); }
根據執行狀況來看,請求獲得兩個相同的對象leagues和league2,可是隻執行了一條SQL語句。
由於第一種查詢的時候生成了查詢SQL語句,查詢出來的數據被context進行追蹤,若是使用DbSet<>()上的Find()方法執行查詢,若是context追蹤內存中能找到這條數據,就不用進行數據庫查詢,直接從內存中讀取數據返回
若是把【第一種】和【第二種】兩種方法返過來查詢就會執行兩次數據庫查詢操做。
若是想使用
Last()
方法查詢語句,必須排序操做:正序.OrderBy(x=>x.Id)
,倒序.OrderByDescending(x=>x.Id)
博客文章能夠轉載,但不能夠聲明爲原創