我正在研究MVC应用程序,我正在使用实体框架来生成表等。我在使用Entity框架加入两个表时遇到了挑战。
我的视图中有一个下拉列表并列出了所有报告类型。我的目标是为视图中的选定下拉列表生成报告。我将选择的id作为参数传递给控制器,我需要从后面的Report表中获取相应的查询并在原始查询中替换。目前我正在尝试通过硬编码查询(而不是从报告表中获取它)但获得异常。注意测试目的我现在不发送任何参数。我只想使用一个报告操作来生成视图中所选值的所有报告。
这是控制器中的代码。
public ActionResult GenerateReport()
{
var model = new ReportViewModel();
using (var context = new FloorContext())
{
// var result = context.Employees.SqlQuery("SELECT * from Employees").ToList();
//Employee employee = context.Employees.FirstOrDefault(emp => emp.EmployeeId ==detail.EmployeeId);
var result2 = context.Database.SqlQuery<string>("SELECT e.EmployeeId, e.EntityId, e.EmployeeRefID,p.ProjectId from Employees e,Projectemployeemapping p where e.EmployeeId=p.EmployeeId").FirstOrDefault<string>();
foreach (var detail in result2)
{
Employee employee = context.Employees.FirstOrDefault(emp => emp.EmployeeId == detail.EmployeeId);
if (employee != null)
model.ReportDetails.Add(
new reportmodel
{
Id = employee.EmployeeId,
EmployeeName = employee.FirstName + " " + employee.LastName,
Location = "",
Project = ""
});
}
}
return PartialView(model);
}
以下两个查询按预期工作。
// var result = context.Employees.SqlQuery("SELECT * from Employees").ToList();
//Employee employee = context.Employees.FirstOrDefault(emp => emp.EmployeeId ==detail.EmployeeId);
但是我需要连接两个表并使用原始SQL查询将结果返回到我的视图。
我已经提到了一些网站,但我没有得到任何加入两个表的答案。以下查询
var result2 = context.Database.SqlQuery<string>("SELECT e.EmployeeId, e.EntityId, e.EmployeeRefID,p.ProjectId from Employees e,Projectemployeemapping p where e.EmployeeId=p.EmployeeId").FirstOrDefault<string>();
gives me the following error:
EntityCommandExectuionException未被用户处理。
数据阅读器有多个字段。多个字段对EDM原语或枚举类型无效。
Projectemployeemapping在运行时就像这样创建,因此我无法在上下文中获取表名。
modelBuilder.Entity<Project>()
.HasMany(prj => prj.Employees)
.WithMany(emp => emp.Projects)
.Map(prj => prj.MapLeftKey("ProjectId").MapRightKey("EmployeeId").