如何将.List <anonymous>转换为.List <classname>?

时间:2019-05-20 10:52:21

标签: c# asp.net-mvc lambda

对于我的Book实体,我想查询以选择所需的属性,并将其作为列表返回到另一种<BookModel>的列表类型中,我将在列表中将其用作模型。但是在这行代码中,红色的波浪线表示错误消息:

cannot convert system.collections.generic.List<anonymous> to system.collections.generic.List<BookModel> 

我当然可以使用Select(b=> new BookModel{...})类而不是匿名类型来创建列表对象类型,但是我想知道是否有一种方法可以不使用BookModel而仅通过使用匿名类型来返回此对象?

这是我想返回匿名类型的列表类型的属性

public class HomeModel
{
    public List<BookModel> PopularBooks { get; set; } 
    public List<BookModel> BestSales { get; set; }
} 

以及我使用lambda表达式进行查询的操作方法。

public ActionResult HomeIndex()
{
    HomeModel model = new HomeModel();
    var bestSalebooks = db.Books.Where(b => b.IsApproved).OrderBy(b => b.DisplayNumber).Select(b => new
    {
        Id =  b.Id,
        Name = b.Name,
        Description = b.Description,
        Price = b.Price,
        DateAdded = b.DateAdded,
        CategoryId = b.CategoryId

    }).ToList();
    model.BestSales = bestSalebooks; //cannot convert system.collections.generic.List<anonymous> to system.collections.generic.Lis<BookModel>            
    return View(model);
}

1 个答案:

答案 0 :(得分:3)

通常,我建议您实例化所需的类型。也就是说,如果您需要BookModel,请实例化该实例,而不要创建匿名类型。

执行Select步骤时,您正在创建匿名类型。 无论如何,您还可以通过执行以下操作将匿名类型转换为您的特定类型:

public ActionResult HomeIndex()
{
    HomeModel model = new HomeModel();
    var bestSalebooks = db.Books.Where(b => b.IsApproved).OrderBy(b => b.DisplayNumber).Select(b => (BookModel)(new
    {
        Id =  b.Id,
        Name = b.Name,
        Description = b.Description,
        Price = b.Price,
        DateAdded = b.DateAdded,
        CategoryId = b.CategoryId

    })).ToList();
    model.BestSales = bestSalebooks;            
    return View(model);
}

这样做,您正在创建BookModel列表。