本文章是根據 微軟MVP solenovex(楊旭)老師的視頻教程撰寫而來,再加上自己的一些理解,
視頻教程地址:https://www.bilibili.com/video/BV1xa4y1v7rR
GitHub原始碼:https://github.com/hllive/LearnEFCore3.1
EFCore主要是通過Linq這個方式查詢資料庫
1、查詢所有資料
把Leagues里的所有資料查詢出來
第一種形式
通過Linq方法.ToList(),EFCore遇到ToList()陳述句就會執行SQL查詢,如果不加過濾條件的話就是把表里的所有資料查詢出來
第二種形式
通過Linq查詢運算式,查詢結果與Linq方法是一樣的
[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);
}
通常在開發程序中都是使用第一種方法
延遲執行
在.ToList()方法之前都是回傳IQueryable型別
IQueryable就是C#中Linq To SQL陳述句的回傳型別,簡單來說IQueryable就是可以疊加處理SQL陳述句,最后統一訪問資料庫,這個處理程序就叫
延遲執行,這一步只是生成了SQL陳述句,并沒有真正執行資料庫查詢
只有執行ToList()方法才真正執行資料庫查詢,這個ToList()方法之前都是可以多次疊加Where()方法
那么在什么情況下會執行資料庫查詢呢?
ToList()、First()、FirstOrDefault()
Single()、SingleOrDefault()、Last()、LastOrDefault()//Single只能是一個資料
Count()、LongCount()、Min()、Max()、Average()、Sum()
Find()、foreach()
還有異步版本:ToListAsync()、FirstAsync()
First回傳符合添加的第一條資料;First與FirstOrDefault的區別,First必須有資料,否則會報錯,FirstOrDefault可有可無
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();
2、查詢單個資料
[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)
博客文章可以轉載,但不可以宣告為原創
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/71.html
