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,但没有运气。我在其他帖子中搜索过,但我没有运气。
答案 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
};