EF Core 6中使用AddDbContextFactory执行SQL查询遇SqlQuery方法缺失问题
问题
我想在EF Core中编写SQL查询,使用了AddDbContextFactory服务,但发现它没有SqlQuery方法,该如何实现查询?
我的Startup.cs代码:
services.AddDbContextFactory<DBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("ConnectionStrings")), lifetime: ServiceLifetime.Transient);
我在Razor页面中注入DbContextFactory:
@inject IDbContextFactory<DBContext> DbFactory
我的查询代码:
string UserId = "a5bddfc0-ee0d-4d33-b384-60629154aad9"; using DBContext db = DbFactory.CreateDbContext(); var result = db.Database.SqlQuery<List<Post>>(@$"SELECT * FROM Posts AS P WHERE P.SenderId IN (SELECT FollowingId FROM Followers WHERE FollowerId = '{UserId}'); ");
出现如下错误:
'DatabaseFacade' does not contain a definition for 'SqlQuery' and no accessible extension method 'SqlQuery' accepting a first argument of type 'DatabaseFacade' could be found (are you missing a using directive or an assembly reference?)
是否有其他方法可编写SQL查询?
问题更新:即使使用AddDbContext也会遇到该错误,我使用的是EF Core 6版本。
解决方案
EF Core 6中不存在SqlQuery方法,该方法属于旧版EF6,EF Core里对应的替代方案是通过实体的DbSet调用FromSqlRaw或FromSqlInterpolated方法。
- 优先使用参数化查询防止SQL注入:禁止直接拼接字符串到SQL语句中,推荐用
FromSqlInterpolated自动处理参数化,或FromSqlRaw配合显式参数。 - 适配场景的修改后代码:
string UserId = "a5bddfc0-ee0d-4d33-b384-60629154aad9"; using DBContext db = DbFactory.CreateDbContext(); // FromSqlInterpolated会自动对UserId做参数化处理 var result = db.Posts.FromSqlInterpolated($"SELECT * FROM Posts AS P WHERE P.SenderId IN (SELECT FollowingId FROM Followers WHERE FollowerId = {UserId})").ToList();
也可以用FromSqlRaw配合SqlParameter实现:
var result = db.Posts.FromSqlRaw( "SELECT * FROM Posts AS P WHERE P.SenderId IN (SELECT FollowingId FROM Followers WHERE FollowerId = @UserId)", new SqlParameter("@UserId", UserId) ).ToList();
注意事项:
- 确保你的
DBContext中已定义DbSet<Post> Posts { get; set; }。 - 如果查询结果是自定义DTO而非完整实体,可创建对应DTO类,再通过
db.Set<CustomDto>().FromSqlRaw(...)查询,需保证DTO属性与查询结果列名匹配。
内容的提问来源于stack exchange,提问作者MB_18
相关产品推荐
相关产品推荐

