【问题标题】:How to convert .List<anonymous> to .List<classname>?如何将 .List<anonymous> 转换为 .List<classname>?
【发布时间】:2019-05-20 10:52:21
【问题描述】:

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

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

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

这里是我要返回匿名类型的 List 类型的属性

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);
}

【问题讨论】:

  • 也许你只需要new BookModel { ... } 而不是new { ... }?您需要使用匿名类型吗?
  • @JonSkeet 这只是出于好奇.. 没有任何要求。
  • 如果某些处理需要我们临时创建一些东西然后从中提取其他东西,那么匿名类型很方便。在那种情况下,匿名类型的成员可能非常明显,但也许它是一次性使用,并且为在方法中暂时使用的东西创建一个类似乎有点过分。如果您知道您的数据代表BookModel,那么跳过匿名类型并只使用类几乎肯定更有意义。

标签: c# asp.net-mvc lambda


【解决方案1】:

一般来说,我建议你实例化你需要的类型。也就是说,如果您需要 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 列表。

【讨论】:

  • 如果我实例化 BookModel 类型会有任何性能问题吗?
  • 不,这将是“规范”的方式
猜你喜欢
  • 2020-11-27
  • 1970-01-01
  • 2020-01-11
  • 2023-01-19
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
相关资源
最近更新 更多