asp.net core系列 33 EF查询数据 (2)

匿名 (未验证) 提交于 2019-12-02 22:06:11

一. 原生SQL查询

。 原始 SQL 查询可返回实体类型,或者从 EF Core 2.1 开始,可返回模型中的查询类型。

  

  1.1 基本的原始SQL查询

    可以使用FromSql扩展方法,基于原始的SQL查询,开始LINQ查询。

        var blogs = context.Blogs             .FromSql("SELECT * FROM dbo.Blogs")             .ToList();
        --通过sql server profiler监听的sql,如下所示:         select * from dbo.blogs

  1.2 原生 SQL 查询可用于执行存储过程(GetMostPopularBlogs)

    var blogs = context.Blogs         .FromSql("EXECUTE dbo.GetMostPopularBlogs")         .ToList();

  1.3 传递参数

    在使用FromSql执行原始sql查询时,传递参数要防止SQL注入攻击,可以在SQL查询字符串中包含参数占位符,然后提供参数值作为附加参数。任何参数值将自动转换为DbParameter来防止SQL注入

       var id = 4;        var blgos=  BloggingContext.Blogs.FromSql("select * from dbo.blogs where BlogId={0}",id).ToList();
        --通过sql server profiler监听的sql,如下所示:         exec sp_executesql N'select * from dbo.blogs where BlogId=@p0',N'@p0 int',@p0=4

与上面占位符实现一样,只不过这里显示提供了命名参数@BlogId)。

       var user = new SqlParameter("@BlogId", 4);        var blgos=  BloggingContext.Blogs.FromSql("select * from dbo.blogs where BlogId={0}", user).ToList();
        --通过sql server profiler监听的sql,如下所示:         exec sp_executesql N'select * from dbo.blogs where BlogId=@BlogId',N'@BlogId int',@BlogId=4

    

  1.4 使用 LINQ 编写

    发送到数据库中的 SQL 查询可以是组合的,则可以在原始 SQL 查询后面紧跟着使用 LINQ 运算符。SELECT SQL 查询一般是可组合的以下示例使用原始SQL查询,然后使用LINQ对其进行编写以执行过滤和排序。

          var blgos=  BloggingContext.Blogs                 .FromSql("select  blogid,url from dbo.blogs")                 .Where(b=>b.BlogId>2)                 .OrderByDescending(b=>b.BlogId)                  .Select(b=> new{ b.BlogId, b.Url})                 .ToList();
       --通过sql server profiler监听的sql,原始sql成了一个子查询,如下所示:     SELECT [b].[BlogId], [b].[Url]     FROM (         select  blogid,url from dbo.blogs     ) AS [b]     WHERE [b].[BlogId] > 2     ORDER BY [b].[BlogId] DESC

二. 异步查询

可以在等数据库操作完成时(I/O),释放当前线程到线程池,该线程可去处理其他请求。

  关键字完成的。

ToListAsync()ToArrayAsync()SingleAsync()Where(...)OrderBy(...)

  下面是一个示例,注意async必须搭配await,只有await完成后才会释放当前EF上下文, async后面必须是Task(无返回值)或Task<T>(有返回值):

    public async Task<List<Blog>> GetBlogsAsync()     {return await context.Blogs.ToListAsync();     }

  

三. 全局查询筛选器

)。

  下面使用HasQueryFilterOnModelCreating

      protected override void OnModelCreating(ModelBuilder modelBuilder)         {             //IsDeleted==1 没有被逻辑删除的Blog数据             modelBuilder.Entity<Blog>().HasQueryFilter(b=>b.IsDeleted==1);         }
         var blgos=  BloggingContext.Blogs                 .FromSql("select * from dbo.blogs")                 .Where(b=>b.BlogId>2)                 .OrderByDescending(b=>b.BlogId)                  .Select(b=> new{ b.BlogId, b.Url})                 .ToList();
    --通过sql server profiler监听的sql,where后面加了IsDeleted==1,如下所示:     SELECT [b].[BlogId], [b].[Url]     FROM (         select * from dbo.blogs     ) AS [b]     WHERE ([b].[IsDeleted] = 1) AND ([b].[BlogId] > 2)     ORDER BY [b].[BlogId] DESC

  

        //可以在Linq查询语句中禁用全局查询筛选器         BloggingContext.Blogs.IgnoreQueryFilters().ToList();

参考文献:

  原生 SQL 查询

  异步查询

  全局查询筛选器

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!