You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:35:40