Asp.net mvc EF MVC Linq-将模型传递到MVC WebGrid时出错

Asp.net mvc EF MVC Linq-将模型传递到MVC WebGrid时出错,asp.net-mvc,entity-framework-4,Asp.net Mvc,Entity Framework 4,当我尝试将Linq查询的结果传递给MVC.Webgrid时,我得到了错误(简化): 这是失败的操作结果: public ActionResult Test() { var metrics = db.Metrics .GroupBy(c => c.Year) .Select(g => new { Year = g.Key, Q

当我尝试将Linq查询的结果传递给MVC.Webgrid时,我得到了错误(简化):

这是失败的操作结果:

 public ActionResult Test()
    {
        var metrics = db.Metrics
            .GroupBy(c => c.Year)
            .Select(g => new
            {
                Year = g.Key,
                Q1 = g.Where(c => c.Quarter == 1).Sum(c => c.Value),
                Q2 = g.Where(c => c.Quarter == 2).Sum(c => c.Value),
                Q3 = g.Where(c => c.Quarter == 3).Sum(c => c.Value),
                Q4 = g.Where(c => c.Quarter == 4).Sum(c => c.Value)
            });                        
        return View(metrics);
    }
我假设,由于我正在创建原始数据的轴心,我需要创建某种新模型,但我不确定在这种情况下如何做到这一点。(刚刚用EF和MVC让我的脚湿了)

有什么想法吗

短暂性脑缺血发作
J

您正在向视图传递一个匿名类型,而您应该传递一个
IEnumerable
。因此,假设
MyMetric
如下所示:

public class MyMetric
{
    public int Year { get; set; }
    public int Q1 { get; set; }
    public int Q2 { get; set; }
    public int Q3 { get; set; }
    public int Q4 { get; set; }
}
您只需从LINQ查询返回一个
IEnumerable

public ActionResult Test()
{
    var metrics = db.Metrics
        .GroupBy(c => c.Year)
        .Select(g => new MyMetric
        {
            Year = g.Key,
            Q1 = g.Where(c => c.Quarter == 1).Sum(c => c.Value),
            Q2 = g.Where(c => c.Quarter == 2).Sum(c => c.Value),
            Q3 = g.Where(c => c.Quarter == 3).Sum(c => c.Value),
            Q4 = g.Where(c => c.Quarter == 4).Sum(c => c.Value)
        });                        
    return View(metrics);
}

您正在向视图传递匿名类型,而应该传递
IEnumerable
。因此,假设
MyMetric
如下所示:

public class MyMetric
{
    public int Year { get; set; }
    public int Q1 { get; set; }
    public int Q2 { get; set; }
    public int Q3 { get; set; }
    public int Q4 { get; set; }
}
您只需从LINQ查询返回一个
IEnumerable

public ActionResult Test()
{
    var metrics = db.Metrics
        .GroupBy(c => c.Year)
        .Select(g => new MyMetric
        {
            Year = g.Key,
            Q1 = g.Where(c => c.Quarter == 1).Sum(c => c.Value),
            Q2 = g.Where(c => c.Quarter == 2).Sum(c => c.Value),
            Q3 = g.Where(c => c.Quarter == 3).Sum(c => c.Value),
            Q4 = g.Where(c => c.Quarter == 4).Sum(c => c.Value)
        });                        
    return View(metrics);
}

所以我需要创建MyMetric类?正如我目前拥有的,我只是以匿名类型返回“查询”的结果。是的,您必须创建MyMetrics类。这称为视图模型。您不能将匿名对象传递给视图。我在您的答案中遗漏了某些地方。我已经尝试实现您的示例,但仍然得到相同的错误。“MyMetric”是如何使“metrics”变成IEnumerable的?注意我的答案中的
.Select
子句:
.Select(g=>newMyMetric
。现在看看你的:
。Select(g=>new
。注意区别吗?这就是结果变成
IEnumerable
,而在您的例子中,您使用的是匿名类型。您的视图是否强类型化为
@model IEnumerable
?还可以尝试调用
.ToList()
返回视图(metrics.ToList())
。那么我需要创建MyMetric类吗?因为我现在有MyMetric类,所以我只是返回“查询”的结果作为匿名类型。是的,您必须创建MyMetrics类。这称为视图模型。您不能将匿名对象传递给视图。我在您的回答中遗漏了某些内容。我尝试实现您的示例,但仍然收到相同的错误。“MyMetric”如何导致“metrics”要成为IEnumerable?请注意我的答案中的
.Select
子句:
。Select(g=>newmymetric
。现在看看你的:
。Select(g=>new
。注意区别吗?这就是结果变成
IEnumerable
,而在您的例子中,您使用的是匿名类型。您的视图是否强类型化为
@model IEnumerable
?还可以尝试调用
.ToList()
返回视图(metrics.ToList());