Asp.net mvc asp.net mvc查询实体模型+传递附加列以查看
在模型中有两个表。书籍和书评。每本书都有一些或没有评分的评论。 在“索引控制器”中,操作希望将要查看的书籍列表和附加列作为该书籍的平均分数传递给该书籍 通常情况下,如果没有其他列索引正文,则如下所示:Asp.net mvc asp.net mvc查询实体模型+传递附加列以查看,asp.net-mvc,entity-framework,model-view-controller,ienumerable,Asp.net Mvc,Entity Framework,Model View Controller,Ienumerable,在模型中有两个表。书籍和书评。每本书都有一些或没有评分的评论。 在“索引控制器”中,操作希望将要查看的书籍列表和附加列作为该书籍的平均分数传递给该书籍 通常情况下,如果没有其他列索引正文,则如下所示: public ActionResult Index() { return View(db.Books.ToList()); } 并使用该模型 @model IEnumerable<NameOfSolution.Models.Books> 在该异常之后,将抛出: 传入字典的模
public ActionResult Index()
{
return View(db.Books.ToList());
}
并使用该模型
@model IEnumerable<NameOfSolution.Models.Books>
在该异常之后,将抛出:
传入字典的模型项的类型为System.Collections.Generic.List1[f_uuAnonymousType14[System.Int32,System.Int32,System.String,System.String]],
但此词典需要类型为“System.Collections.Generic.IEnumerable1[NameOfSolution.Models.Books]”的模型项
问题是:解决这个问题的正确方法是什么?
我应该将var BooksList强制转换为更通用的模型,还是将单独的文件类添加到解决方案中,并像强类型模型一样使用它?查看预期的NameOfSolution.Models.Books对象列表,但您传递了匿名类列表
使用select new NAME of Solution.Models.Books视图模型类型和声明的视图模型(即@model IEnumerable)不同。 你可以使用下面的一些技巧
var BooksList = from b in db.Books
select new NameOfSolution.Models.Books
{
b.Id,
b.BookRef,
b.BookTitle,
b.Authors
};
这通常由视图模型完成。以最简单的形式:
public class BookViewModel
{
public string BookTitle { get; set; }
public double? AverageRating { get; set; }
}
...
var booksList = from b in db.Books
select new BookViewModel
{
BookTitle = b.BookTitle,
AverageRating = b.Reviews
.Average(r => r.Score)
};
AverageRating是一种可为null的类型,因为可能存在没有评论的书籍,因此视图模型应该能够保存null值
当然,@model应该是IEnumerable。如果我这样做,编译器将返回:错误1无法使用集合初始值设定项初始化类型“NameOfSolution.Models.Books”,因为它没有实现“System.Collections.IEnumerable”。模型是从数据库为EFI生成的,出现错误1无法使用集合初始值设定项初始化类型“NameOfSolution.Models.Books”,因为它未实现“System.Collections.IEnumerable”。之后包括您的更改和{Id=b.Id,BookRef=b.BookRef,BookRef=b.BookRef,Authors=b.Authors};我得到了实体或复杂类型“NameOfSolutionModel.Books”不能在LINQ to Entities查询中构造。我想你可以在构造视图模型之前调用ToList,以防你的Book实体没有像这样的额外数据集正在工作的公共ActionResult索引{IEnumerable BooksList=db.Books.Wherep=>p.bookstitle.StartsWithH;返回ViewBooksList.ToList;}
public class BookViewModel
{
public string BookTitle { get; set; }
public double? AverageRating { get; set; }
}
...
var booksList = from b in db.Books
select new BookViewModel
{
BookTitle = b.BookTitle,
AverageRating = b.Reviews
.Average(r => r.Score)
};