【问题标题】:Cannot implicit convert type List to IEnumerable while grouping with Linq使用 Linq 分组时无法将类型 List 隐式转换为 IEnumerable
【发布时间】:2017-09-09 00:37:38
【问题描述】:

MVC 和 Linq 的新手。

我能够很好地显示所有记录,但现在我试图按名称获取记录计数,并且只需选择 2 个字段:名称和计数

我想我应该创建一个新的 ViewModel,填写 Name、Count 并将其发送到视图。

public ActionResult Index()
    {
        var load =
            db.loadingPPHs.Where(s => s.WORKDAY == db.loadingPPHs.Max(x => x.WORKDAY))
                .GroupBy(fu => fu.TMNAME)
                .Select(g => new {Name = g.Key, Count = g.Count()}).ToList();


        var viewModel = new loadingViewModel
        {
            LoadingListCount = load
        };

        return View(viewModel);
    }

上面的 linq 按预期工作。 视图模型:

public class loadingViewModel
    {

        public IEnumerable<LoadingListCount> LoadingListCount { get; set; }


    }

    public class LoadingListCount
    {

        public string Name{ get; set; }
        public int Count { get; set; }

    }

但是,我遇到了一个错误。无法将类型“System.Collections.Generic.List”隐式转换为“System.Collections.Generic.IEnumerable”。存在显式转换(您是否缺少演员表?)

我尝试将查询转换为列表和 IEnumerable,但没有运气。我搜索了其他帖子,但我没有运气。

【问题讨论】:

    标签: c# asp.net-mvc entity-framework linq


    【解决方案1】:

    由于两个主要原因,您会收到错误,第一个是 Linq 生成了一个匿名类型的集合,附加的 .ToList() 将结果作为匿名类型对象的列表提供给您。但预期的结果将是IEnumerable&lt;LoadingListCount&gt; 类型,所以这里我们需要做一些更改,首先,我们必须创建一个LoadingListCount 类型的对象,现在Linq 将按预期为您提供输出,但附加的@ 987654324@ 会将它们转换为List&lt;LoadingListCount&gt; 以避免我们也必须删除它们。最后,查询将如下所示:

    var load = db.loadingPPHs.Where(s => s.WORKDAY == db.loadingPPHs.Max(x => x.WORKDAY))
                             .GroupBy(fu => fu.TMNAME)
                             .Select(g => new LoadingListCount {Name = g.Key, Count = g.Count()})
    

    【讨论】:

      【解决方案2】:
      .Select(g => new {Name = g.Key, Count = g.Count()})
      

      产生匿名类型的对象,并将它们放入一个列表中。由于您需要IEnumerable&lt;LoadingListCount&gt;,而不是IEnumerable&lt;SomeAnonymousType&gt;,而是通过在new 运算符的调用中指定类型来创建LoadingListCount 的实例:

      .Select(g => new LoadingListCount {Name = g.Key, Count = g.Count()})
      

      【讨论】:

        【解决方案3】:

        您的查询正在创建一组匿名对象 - 您需要将查询投影到您的模型中

        IEnumerable<LoadingListCount> load = 
            db.loadingPPHs.Where(s => s.WORKDAY == db.loadingPPHs.Max(x => x.WORKDAY))
                .GroupBy(fu => fu.TMNAME)
                .Select(g => new LoadingListCount { Name = g.Key, Count = g.Count() })
        var viewModel = new loadingViewModel
        {
            LoadingListCount = load
        };
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多