2020-05-22 -- Linq查詢提綱

  • 客戶端與服務(wù)器評估

    • 頂級投影

    頂級投影中的客戶端評估
    • 不支持的客戶端評估

    Entity Framework Core 會阻止此類客戶端評估,并引發(fā)運(yùn)行時異常
    • 顯式客戶端評估

    顯式方式強(qiáng)制進(jìn)行客戶端評估
  • 跟蹤與非跟蹤查詢

    • 無健實(shí)體
    • 跟蹤查詢
    • 非跟蹤查詢
    • 標(biāo)識解析
    • 跟蹤和自定義投影
  • 復(fù)雜查詢運(yùn)算符

    • Join
    • GroupJoin
    • SelectMany
      • 集合選擇器不引用外部
      • 集合選擇器引用 where 子句中的外部
      • 集合選擇器引用非 where 情況下的外部
    • GroupBy
    • Left Join
  • 加載相關(guān)數(shù)據(jù)

    https://docs.microsoft.com/zh-cn/ef/core/querying/related-data
    • 預(yù)加載

      • Include , ThenInclude
        a. 經(jīng)過篩選的包含
        b. 派生類型上的包含
    • 顯式加載

      • 查詢相關(guān)實(shí)體
    • 延遲加載

      • 使用代理的延遲加載
        a. 安裝 Microsoft.EntityFrameworkCore.Proxies
        b. 配置 DbContext 調(diào)用 UseLazyLoadingProxies 擴(kuò)展方法
        c. 屬性必須為 Virtual 且類可繼承
      • 不使用代理的延遲加載
        a. 不需要屬性為 Virtual 且不要求類可繼承
    • 關(guān)聯(lián)數(shù)據(jù)和序列化
      Json序列化時的可能的循環(huán)引用異常
      配置 JsonNet 忽略循環(huán)引用
      services.AddMvc() .AddJsonOptions( options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore );

  • 異步查詢

    當(dāng)在數(shù)據(jù)庫中執(zhí)行查詢時,異步查詢可避免阻止線程
    一組類似于 LINQ 方法的異步擴(kuò)展方法
  • 原生 SQL 查詢

    • 原始 SQL 查詢可返回一般實(shí)體類型或者模型中的無鍵實(shí)體類型。
    • 無法直接將一個 SQL 映射為一個普通類 ( 即不在 dbContext 使用 DbSet 定義的屬性 )
    • 基本原生 SQL 查詢
      var blogs = context.Blogs .FromSqlRaw("SELECT * FROM dbo.Blogs") .ToList();
    • 傳遞參數(shù)
var user = "johndoe";
var blogs = context.Blogs
    .FromSqlRaw("EXECUTE dbo.GetMostPopularBlogsForUser {0}", user)
    .ToList();

FromSqlInterpolated 和 ExecuteSqlInterpolated方法, 使用字符串內(nèi)插語法,
但是 {} 通過 DbParamater 形式傳遞,而不是直接的字符串替代;
例如下面代碼中的 user

var user = "johndoe";
var blogs = context.Blogs
    .FromSqlInterpolated($"EXECUTE dbo.GetMostPopularBlogsForUser {user}")
    .ToList();
  • 原生SQL結(jié)合LINQ 和 包含關(guān)聯(lián)數(shù)據(jù)

  • 更改跟蹤

  • 限制

  • 全局查詢篩選器

    a. 定義查詢篩選器
    modelBuilder.Entity<Blog>().Property<string>("_tenantId").HasColumnName("TenantId");
    // Configure entity filters
    modelBuilder.Entity<Blog>().HasQueryFilter(b => EF.Property<string>(b, "_tenantId") == 22);
    modelBuilder.Entity<Post>().HasQueryFilter(p => !p.IsDeleted);
    b. 禁用 查詢篩選器
    c. 限制

  • 查詢標(biāo)記

不改變SQL的執(zhí)行,而是在SQL中增加注釋文本,多次調(diào)用將增加多行注釋文本
IQueryable.TagWith(string tags) 方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容