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()来进行关联数据的获取。
作者:Lyon_Yao
链接:https://www.jianshu.com/p/4518cf558db3
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。