五、Entity Framework Core 3.1入門教程-查詢數據

本文章是根據 微軟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)

博客文章能夠轉載,但不能夠聲明爲原創

相關文章
相關標籤/搜索