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 @ 2023-03-13 14:12  dreamw  阅读(359)  评论(0)    收藏  举报