使用Linq进行分组时,无法将类型List隐式转换为IEnumerable

时间:2017-04-13 03:16:33

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

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

    }

但是,我收到了错误消息。无法隐式转换类型&#39; System.Collections.Generic.List&lt;&gt;&#39;到&#39; System.Collections.Generic.IEnumerable&#39;。存在显式转换(您是否错过了演员?)

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

3 个答案:

答案 0 :(得分:4)

由于两个主要问题,你得到的错误是,第一个是Linq生成匿名类型的集合,附加的.ToList()将结果作为匿名类型对象列表。但是预期的结果是类型IEnumerable<LoadingListCount>所以我们需要做一些更改,首先我们必须创建一个LoadingListCount类型的对象,现在Linq会按预期给你输出,但是附加的.ToList()会将其转换为List<LoadingListCount>,以避免我们必须将其删除。最后,查询将如下所示:

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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

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