错误:传入字典的模型项的类型为'System.Data.Entity.Infrastructure.DbQuery(snip)...正在寻找'Advocate'类型
控制器方法如下所示:
[HttpGet]
public ActionResult AdvocateEdit(int id)
{
var advocate = from a in db.Query<Advocate>().Include(a => a.AdvocateId)
where (a.AdvocateId == id)
select a;
return View(advocate);
}
视图确实输入到Advocate @model,在单步执行后,我很确定问题是这个查询。它返回时需要是Advocate类型。
db.Query is an IQueryable<T> method in my DbContext that returns Set<T>().
如果需要更多信息,请与我们联系。谢谢大家
ADDED ----
DbContext.cs
public interface IAcmeDb : IDisposable
{
IQueryable<T> Query<T>() where T : class;
}
public class AcmeDb : DbContext, IAcmeDb
{
public AcmeDb() : base("name=AcmeDB") {}
public DbSet<Advocate> Advocates { get; set; }
IQueryable<T> IAcmeDb.Query<T>()
{
return Set<T>();
}
}
答案 0 :(得分:4)
我认为你想将一个Advocate元素传递给视图,而不是查询本身。试试这个:
return View(advocate.First());
代码中的propate对象是IQueryable类型,如果您的视图需要一个Advocate对象,只需使用First()或FirstOrDefault()获取查询的第一个元素。
答案 1 :(得分:3)
如果您的视图需要单个Advocate
,并且对于给定的ID总是只有一个实体,那么您需要:
[HttpGet]
public ActionResult AdvocateEdit(int id)
{
try
{
Advocate advocate = db.Query<Advocate>().Single(a => a.AdvocateId == id);
return View(advocate);
}
catch(InvalidOperationException ex)
{
//handle the case where no entity matches the supplied id (return status code 404?), or
//there are no Advocates at all (redirect to a create page?), or
//more than one entity matches (return status code 500)
}
}
答案 2 :(得分:2)
至少有一个值得注意的问题。 LINQ倾向于使用延迟执行。在我的代码中没有,我看到你强迫查询执行。除非View(advocate)
中某处枚举查询生成的IEnumberable<T>
,否则您将不会处理Advocate
类型的对象。
我建议在查询结尾添加ToList()
或ToArray()
调用,这样可以确保它实际执行。如果这不起作用,我会将查询分开并确保db.Query<Advocate>()
返回您期望的内容。
List<Advocate> = db.Query<Advocate>().Include(a => a.AdvocateId)
.Where(a.AdvocateId == id)
.Select(a => a).ToList();
我已将您的查询转换为方法语法,因为这是我所熟悉的。上面的例子可能会解决你的问题。我认为要保留查询语法,你应该把整个左侧放在父母身上,然后调整ToList()
调用,但是我不确定正确的语法是什么。
编辑:根据其他评论,问题不是延迟执行,而是尝试将集合传递给寻找单个实例的方法。使用上面相同的代码,您只需将ToList()
更改为FirstOrDefault()
,您的代码就可以使用;
List<Advocate> = db.Query<Advocate>().Include(a => a.AdvocateId)
.Where(a.AdvocateId == id)
.Select(a => a).FirstOrDefault();
注意:引用类型的默认值为null
如果您没有针对无效进行适当的检查,这当然会导致问题。