如何在C#实体中使用SQL原语?执行查询时遇错误求助
解决C#实体中使用SQL原语查询的错误问题
看起来你在使用Entity Framework执行原生SQL查询时遇到了问题,我来帮你梳理几个常见的错误点和对应的解决办法:
1. 误用了错误的DbSet集合
你代码里调用的是db.ChungLoais.SqlQuery(...),但查询的是dbo.Student表的字段——这明显不匹配!ChungLoais应该是对应数据库中另一个表的DbSet,你需要使用对应Student表的DbSet(通常命名为Students)来执行查询。
同时,你的Student实体类必须包含studentID和studentName这两个属性,且属性的类型、名称要和数据库字段完全匹配(如果大小写不一致,还需要添加[Column]特性指定数据库字段名,比如[Column("studentID")])。
2. 区分EF6和EF Core的API差异
不同版本的Entity Framework,原生SQL查询的API是不一样的:
如果你用的是EF6:
修正后的代码应该是这样:
// 先确保你的DbContext里定义了对应Student表的DbSet public class studentEbestuur : DbContext { public DbSet<Student> Students { get; set; } // 其他DbSet和配置... } // 查询代码 using(studentEbestuur db = new studentEbestuur()) { var ListST = db.Students.SqlQuery("SELECT studentID, studentName FROM dbo.Student").ToList(); }
如果你用的是EF Core:
EF Core推荐使用FromSqlRaw替代旧的SqlQuery方法:
// 同样确保DbContext里有Students这个DbSet using(studentEbestuur db = new studentEbestuur()) { var ListST = db.Students.FromSqlRaw("SELECT studentID, studentName FROM dbo.Student").ToList(); }
3. 如果不需要返回完整实体(仅需指定字段)
如果你不想用Student实体类,只想返回查询的两个字段,可以自定义一个DTO类,然后通过数据库上下文直接执行查询:
EF6写法:
// 定义DTO类 public class StudentDto { public int studentID { get; set; } public string studentName { get; set; } } // 查询 using(studentEbestuur db = new studentEbestuur()) { var ListST = db.Database.SqlQuery<StudentDto>("SELECT studentID, studentName FROM dbo.Student").ToList(); }
EF Core写法:
// 同样定义StudentDto类 using(studentEbestuur db = new studentEbestuur()) { var ListST = db.Set<StudentDto>().FromSqlRaw("SELECT studentID, studentName FROM dbo.Student").ToList(); }
最后需要检查的几个细节
- 确认
studentEbestuur上下文的连接字符串配置正确,能够访问目标数据库 - 检查
dbo.Student表是否存在,字段名studentID、studentName是否拼写正确 - 确保你的应用程序有访问该数据库表的权限
内容的提问来源于stack exchange,提问作者Quyền Hoàng
相关产品推荐
相关产品推荐

