作者:歪歪Doris | 来源:互联网 | 2023-02-08 11:28
我的查询有问题.我想在视图上显示结果.
[HttpGet]
[ValidateAntiForgeryToken]
public async Task Index()
{
return View(await _Context.Employee
.FromSql("EXEC sp_GetLoanDetails")
.ToArrayAsync());
}
这是我要查看的项目列表:
public class StoredProcRow
{
[Key]
public int empID { get; set; }
public string empFullName { get; set; }
public double EducationalLoan { get; set; }
public double PettyCash { get; set; }
public double BusinessLoan { get; set; }
public double ApplianceLoan { get; set; }
public double EmergencyLoan { get; set; }
public double AllPurposeLoan { get; set; }
public double KAPUSOIILoan { get; set; }
public double FiestaLoan { get; set; }
public double SalaryLoan { get; set; }
public double Pledge { get; set; }
public double PagIbigLoan { get; set; }
public double SSSLoan { get; set; }
public double AllAroundLoan { get; set; }
public double Total { get; set; }
}
注意:这些实体名称与列名称中的实体相同sp_GetLoanDetails
这可以在EF Core 1.1上实现吗?或者我是否需要返回手动ADO.NET代码?
谢谢!
1> poke..:
虽然对Entity Framework Core的存储过程的支持还不完全,但您仍然可以使用它FromSql
来使用存储过程.
为此,数据库上下文需要知道要从存储过程映射到的实体.不幸的是,现在唯一的方法是将其实际定义为数据库上下文中的实体:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity(entity =>
{
// …
});
}
然后,您可以通过FromSql
在该实体的集合上运行该方法来使用存储过程:
public virtual IQueryable GetLoanDetails()
{
return Set().FromSql("[sp_GetLoanDetails]").AsNoTracking();
}
请注意,我在AsNoTracking
这里使用一个来避免数据上下文跟踪来自存储过程的实体的更改(因为您无论如何都无法更新它们).此外,我在方法Set()
内部使用以避免必须将类型公开为数据库上下文中的成员,因为无论如何都不能使用没有存储过程的集合.
顺便说一句.您EXEC
传递给的sql语句中不需要(不确定是否可行)FromSql
.只需传递存储过程名称及其任何参数,例如:
Set().FromSql("[SomeStoredProcedure]");
Set().FromSql("[SProcWithOneArgument] @Arg = {0}");
Set().FromSql("[SProcWithTwoArguments] @Arg1 = {0}, Arg2 = {1}");