我正在使用实体框架为我的大学做一个项目,我需要从表中获取多个数据而不相互引用。我们的想法是在列表中显示基本信息,当您单击“详细信息”按钮时,它会显示所有信息,包括与此表无关的信息。
我试图在控制器中执行此操作,但遗憾的是,没有成功:
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
ProcessArea processArea = db.ProcessArea.Find(id);
if (processArea == null)
{
return HttpNotFound();
}
var query = from ap in db.ProcessArea
join mg in db.GenericGoal on ap.IdProcessArea equals mg.IdGenericGoal
select new ProcessAreaModelView()
{
InitialsLevelMaturity = mg.Initials,
NameLevelMaturity = mg.Name,
DescriptionLevelMaturity = mg.Description,
Initials = ap.Initials,
Name = ap.Name,
Description = ap.Description
};
query.ToList();
return View(query);
}
我有一个名为“Process Area”的模型,因为我不得不加入我认为我必须有另一个模型,因为它们是不同的信息所以我创建了“ProcessAreaModelView”
当我点击“详细信息”时,会出现错误:
插入字典中的模板项的类型为'System.Data.Entity.Infrastructure.DbQuery'1 [AkaelApp.Models.AreaProcessoModelView]',但此字典需要一个类型为'AkaelApp.Models.AreaProcessoModelView'的项目。
我做错了什么?
答案 0 :(得分:0)
错误消息显示,您的视图强烈输入AreaProcessoModelView
,但您的代码传递的IQIeryable为AreaProcessoModelView
您需要将LINQ查询执行的结果传递给视图,而不是查询。由于您的查询表达式将返回一个集合,因此您需要在集合上调用First
或FirstOrDefault
方法以获取需要传递给视图的单个项目。您的视图是强类型的单个对象,而不是集合
你也在Find
上调用db.ProcessArea
方法,但实际上并没有使用它(除了检查它是否存在)。您可以将where子句添加到LINQ查询中。
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var item = (from ap in db.ProcessArea
join mg in db.GenericGoal on ap.IdProcessArea equals mg.IdGenericGoal
where ap .Id == id.Value
select new AreaProcessoModelView()
{
InitialsLevelMaturity = mg.Initials,
NameLevelMaturity = mg.Name,
DescriptionLevelMaturity = mg.Description,
Initials = ap.Initials,
Name = ap.Name,
Description = ap.Description
}).FirstOrDefault();
if(item ==null)
{
return HttpNotFound(); // Or a return a view with message "item not found"
}
return View(item);
}
这应该可以正常运行,假设您的详细信息视图强类型为AreaProcessoModelView
类。
答案 1 :(得分:0)
您需要传递AreaProcessoModelView
的单个实例,而不是查询。
return View(query.Single());
答案 2 :(得分:0)
查询返回一个列表 - 但您需要一个对象。您可以使用query.FirstOrDefault()
获取第一个匹配项(如果多个匹配项是您要检测的错误,则可以使用SingleOrDefault()
)。你不需要query.ToList()
BTW(你真的丢弃了结果)。