您的 DbContext 代表数据库的模型。它为您隐藏了数据库的实际调用方式。
存储过程是数据库的一部分。您的 DbContext 应该提供一个函数来调用存储过程,同时隐藏存储过程用于执行该函数。换句话说:DbContext 的用户不关心该函数是使用查询或 SQL 执行还是使用存储过程来执行。它可以是一条 SQL 语句,然后更改为存储过程,而用户无需知道它已更改。
调用存储过程是使用 DbContext.DataBase.ExecuteSqlCommand 完成的。有一个异步等待函数DbContext.DataBase.ExecuteSqlCommandAsync
class MyDbContext : DbContext
{
... // DbSets
public async Task<MyResult> DoSomethingAsync(...)
{
object[] params = new Object[]
{
new SqlParameter(@"ParamX", ...),
new SqlParameter(@"ParamY", ...);
}
const string SqlCommand = @"Exec MyStoredProcedure
@ParamX,
@ParamY);
return await this.Database.ExecuteSqlCommandAsync(sqlCommand, params);
}
同样,如果您不想调用存储过程而是调用 DbSet 上的 LINQ 查询,则可以使用DbSet 的异步扩展函数
var result = await dbContext.MyItems
.Where(item => ...)
.GroupBy(item => ...)
.OrderBy(group => ...)
.FirstOrDefaultAsync();
请注意,因为使用延迟执行只会更改 IQueryable 的表达式。没有延迟执行的函数(ToList、Any、First、Max,...)将导致提供程序执行表达式。所以只有那些功能需要异步版本