Part3-31:EF Core执行实体相关查询原生SQL语句>>通过FromSqlInterpolated

一、视频来源

Part3-31:EF Core执行实体相关查询原生SQL语句_哔哩哔哩_bilibili

二、实体相关SQL查询

1、如果要执行的原生SQL是一个查询(SELETE)语句,并且查询的结果也能对应一个实体,就可以调用对应实体的DbSet的
FromSqllnterpolated()方法来执行一个查询SQL语句,同样 使用字符串内插来传递参数。
2、FromSqlInterpolated也不是立即执行(延迟执行),是在foreach时才执行,详见Part3-25:EF Core IQueryable的延迟执行。FromSqlInterpolated返回类型是IQueryable<TEntity>。
3、代码及数据

本例中Movie在数据库中的数据


数据查询结果
  • 代码,本例中因为返回结果与Movie相关,依据1中说明,直接在db.Movie中执行FromSqlInterpolated。备注:在SQL SERVER中order by newid()实现随机排序,用EF CORE实现是.OrderBy(a=> Guid.NewGuid())
  •         int year = 2000;
            ImportExcelMvctestContext db = new ImportExcelMvctestContext();
            IQueryable<Movie> moives =
                db.Movies.FromSqlInterpolated(@$"select * from Movie
                where DatePart(year,ReleaseDate)>{year}
                order by newid()");
            foreach (var m in moives)
            {
                Console.WriteLine(m.Id + " " + m.Title + " " + m.ReleaseDate);
            }
    

    打印结果:本例中Movie表中只有一条记录的ReleaseDate年份大于2020


     

    查看控制台日志,观察生成的SQL语句


     

    三、好用的IQUERYABLE

    1、FromSqlInterpolated()方法的返回值是IQueryable类型的,因此 我们可以在实际执行IQueryable之前,对IQueryable进行进一步的处理。例子如下:

    • 代码
            int year = 1900;
            ImportExcelMvctestContext db = new ImportExcelMvctestContext();
            IQueryable<Movie> moives =
                db.Movies.FromSqlInterpolated(@$"select * from Movie
                where DatePart(year,ReleaseDate)>{year}
                ");
            int c = moives.Count();
            Console.WriteLine("查询结果有:"+ c +"条");
            foreach (Movie m in moives.Skip(2).Take(2))
            {
                Console.WriteLine(m.Id + " " + m.Title + " " + m.ReleaseDate);
            }
    
    输出结果
     

    2、把只能用原生SQL语句写的逻辑用FromSqlInterpolated()去执行,然后把分页、分组、二次过滤、排序、Include等其他逻辑尽可能仍然使用EFCore的标准操作去实现

    四、局限性

    • SQL查询必须返回实体类型对应数据库表的所有列;
    • 结果集中的列名必须与属性映射到的列名称匹配。
    • 只能单表查询,不能使用Join语句进行关联查询。但是可以在查询后面使用Include()来进行关联数据的获取。
     
     
    0人点赞
     
     


    作者:Lyon_Yao
    链接:https://www.jianshu.com/p/4518cf558db3
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    posted @   dreamw  阅读(297)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · 分享4款.NET开源、免费、实用的商城系统
    · 全程不用写代码,我用AI程序员写了一个飞机大战
    · MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
    · 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
    · 上周热点回顾(2.24-3.2)
    点击右上角即可分享
    微信分享提示