美文网首页
2020-05-22 -- Linq查询提纲

2020-05-22 -- Linq查询提纲

作者: daiwei_9b9c | 来源:发表于2020-05-22 21:52 被阅读0次
    • 客户端与服务器评估

      • 顶级投影

      顶级投影中的客户端评估
      • 不支持的客户端评估

      Entity Framework Core 会阻止此类客户端评估,并引发运行时异常
      • 显式客户端评估

      显式方式强制进行客户端评估
    • 跟踪与非跟踪查询

      • 无健实体
      • 跟踪查询
      • 非跟踪查询
      • 标识解析
      • 跟踪和自定义投影
    • 复杂查询运算符

      • Join
      • GroupJoin
      • SelectMany
        • 集合选择器不引用外部
        • 集合选择器引用 where 子句中的外部
        • 集合选择器引用非 where 情况下的外部
      • GroupBy
      • Left Join
    • 加载相关数据

      https://docs.microsoft.com/zh-cn/ef/core/querying/related-data
      • 预加载

        • Include , ThenInclude
          a. 经过筛选的包含
          b. 派生类型上的包含
      • 显式加载

        • 查询相关实体
      • 延迟加载

        • 使用代理的延迟加载
          a. 安装 Microsoft.EntityFrameworkCore.Proxies
          b. 配置 DbContext 调用 UseLazyLoadingProxies 扩展方法
          c. 属性必须为 Virtual 且类可继承
        • 不使用代理的延迟加载
          a. 不需要属性为 Virtual 且不要求类可继承
      • 关联数据和序列化
        Json序列化时的可能的循环引用异常
        配置 JsonNet 忽略循环引用
        services.AddMvc() .AddJsonOptions( options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore );

    • 异步查询

      当在数据库中执行查询时,异步查询可避免阻止线程
      一组类似于 LINQ 方法的异步扩展方法
    • 原生 SQL 查询

      • 原始 SQL 查询可返回一般实体类型或者模型中的无键实体类型
      • 无法直接将一个 SQL 映射为一个普通类 ( 即不在 dbContext 使用 DbSet 定义的属性 )
      • 基本原生 SQL 查询
        var blogs = context.Blogs .FromSqlRaw("SELECT * FROM dbo.Blogs") .ToList();
      • 传递参数
    var user = "johndoe";
    var blogs = context.Blogs
        .FromSqlRaw("EXECUTE dbo.GetMostPopularBlogsForUser {0}", user)
        .ToList();
    

    FromSqlInterpolated 和 ExecuteSqlInterpolated方法, 使用字符串内插语法,
    但是 {} 通过 DbParamater 形式传递,而不是直接的字符串替代;
    例如下面代码中的 user

    var user = "johndoe";
    var blogs = context.Blogs
        .FromSqlInterpolated($"EXECUTE dbo.GetMostPopularBlogsForUser {user}")
        .ToList();
    
    • 原生SQL结合LINQ 和 包含关联数据

    • 更改跟踪

    • 限制

    • 全局查询筛选器

      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. 限制

    • 查询标记

    不改变SQL的执行,而是在SQL中增加注释文本,多次调用将增加多行注释文本
    IQueryable.TagWith(string tags) 方法

    相关文章

      网友评论

          本文标题:2020-05-22 -- Linq查询提纲

          本文链接:https://www.haomeiwen.com/subject/syicahtx.html