我已经研究过,并且总是发现像这样的例子:
var blogs = context.Blogs
.FromSql("SELECT * FROM dbo.Blogs")
.ToList();
问题在于,我不想在Blogs表上运行我的原始SQL。基本上,我想要实现这样一个接口:
bool ExecuteNonSafeSql(
string connectionString,
string sql);
有没有使用DbContext的方法可以做到这一点?
我已经研究过,并且总是发现像这样的例子:
var blogs = context.Blogs
.FromSql("SELECT * FROM dbo.Blogs")
.ToList();
bool ExecuteNonSafeSql(
string connectionString,
string sql);
有没有使用DbContext的方法可以做到这一点?
您可以使用 context.Database.ExecuteSqlCommand()
来执行 SQL。
如果您想使用 SqlCommand
,可以通过以下方式获取连接:
var cnn = (SqlConnection) context.Database.GetDbConnection();
cnn.Open();
using (var cmd = new SqlCommand(sql, cnn))
using (var rdr = cmd.ExecuteReader(CommandBehavior.SingleResult))
在撰写本文时(EF Core 2.1),没有办法执行任意的返回序列的SQL命令。
只有实体类型和查询类型可以通过FromSql
支持。
因此,最接近的解决方案是定义查询类型(保存查询结果的类)并使用FromSql
,但它不是通用的 - 查询类型必须通过流畅的API在DbContext
中注册,并且该方法应该接收指定该类型的通用参数,例如
class ResultType
{
// ...
}
那么
modelBuilder.Query<ResultType>();
最后
db.Query<ResultType>().FromSql(...)
Database.ExecuteSqlCommand
可以执行任意SQL语句,但不能用于返回序列(IEnumerable<T>
, IQueryable<T>
)。.ExecuteSqlCommand
运行类似于DROP DATABASE IF EXISTS {databaseName};
这样的命令吗? - J86您可以直接使用Database.SqlQuery()
函数在上下文中执行查询。
这里我创建了一个通用函数,可以直接在数据库中执行您的查询,而不是实体。
public static List<T> Execute<T>(MyDbContext context, string query) where T : class
{
var result = context.Database
.SqlQuery<T>(query)
.ToList();
return result;
}
var blogs = Execute<Blog>(context, "SELECT * FROM dbo.Blogs");
context.Database
的方法,例如context.Database.ExecuteSqlCommand()
或context.Database.SqlQuery()
。使用哪种方法取决于您想要做什么。您的语句将返回什么值? - NineBerry