原始SQL查询和Entity Framework Core

12

我将我的应用程序迁移到了ASP.NET MVC Core和Entity Framework Core,但是我遇到了问题。我有一条原始的SQL查询语句,像这样转换为实体:

var rawSQL = dbContext.Database.SqlQuery<SomeModel>("Raw SQL Query").ToList();

但是在context.Database中没有SqlQuery<T>。你有解决这个问题的方法吗?


dbContext是否已正确初始化为Entities - James Joyce Alano
@MatchesMalone 是的,普通的LINQ查询正常工作。 - Obin
使用扩展方法来使用参数化(或非参数化)SQL,请参见下面的答案。 - diegosasw
1个回答

12

请确保添加using Microsoft.Data.Entity;,因为有一个您可以使用的扩展方法。

var rawSQL = dbContext.SomeModels.FromSql("your SQL");

更好的是,与其使用原始的SQL(存在SQL注入攻击的风险),这个FromSql方法允许你使用参数化查询,例如:

dbContext.SomeModels.FromSql("SELECT * FROM dbo.Blogs WHERE Name = @p0", blogName);

1
工作得很好,但从特定实体模型调用SQL查询而不是通常的数据库感觉有些奇怪。关于注入攻击,我知道并且正在使用SQL参数,但我想在示例中展示一个简单的问题。谢谢。 - Obin
@iberodev 如果你的SQL查询包含两个表,你会怎么做? - nam
通过添加.Include(b => b.Posts),您可以加入另一个表,如此处所示:https://docs.efproject.net/en/latest/querying/raw-sql.html#composing-with-linq中的@nam。 - diegosasw
2
只是一条注释,对于Entity Framework Core,我必须包含命名空间:using Microsoft.EntityFrameworkCore; - Reynier Booysen
2
查询 DbContext 而不是 DbSet 怎么样?@iberodev - ManirajSS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接