Asp.Net Foreach和groupby

时间:2016-07-25 08:58:27

标签: c# asp.net entity-framework

我想通过ProgramId获取所有记录和分组,然后查看此内容。

var userProgramsStats = (from a in db.Statistics where a.UserId == login.GetUserObject().UserId select a)
                .GroupBy(a => a.ProgramId);

ViewBag.userProgramsStats = userProgramsStats

在模板中:

 @foreach (var item in ViewBag.UserProgramsStats)
 {
     @item.MoneyRate
 } 

不幸的是我看到了这个错误:

  

发生了未处理的异常:'object'不包含'MoneyRate'的定义

我必须获取所有记录,其中userid,然后groupby programid并将一列MoneyRate相加。然后我想要这样使用:

@item.MoneyRate<br /> // sum MoneyRate
@item.OthercolumnNormal

2 个答案:

答案 0 :(得分:0)

您的错误是由于数据的对象类型错误item: 在处理foreach时,无法识别您的数据类型。

您应该指定数据模型:

public class UserStat {

   public double MoneyRate { get; set; }
   public string ColumnNormal {get; set;} 

   public UserStat() { }
   public UserStat(double moneyRate, string columnNormal)
   {
       MoneyRate = moneyRate;
       ColumnNormal = columnNormal;
   }
}

然后在你的模板中,你应该:

@foreach (UserStat item in ViewBag.UserProgramsStats)
{
    @item.MoneyRate
}

您可能也会这样做:

@foreach (dynamic item in ViewBag.UserProgramsStats)
{
    @item.MoneyRate
}

使用dynamic关键字将评估属性是否在运行时存在。

答案 1 :(得分:0)

您收到类型错误,因为userProgramsStats的类型不包含属性MoneyRate。

你说你要总结MoneyRate列,为此你需要将分组结果投影到一个新类型。

采用现有的查询,我在其末尾添加了一个select语句,该语句投射到一个新的匿名类型programId和每个programId的MoneyRate列的总和。

var result = (from a in db.Statistics where a.UserId login.GetUserObject().UserId select a)
                .GroupBy(a => a.programid)
                .Select(group => new { MoneyRateSum = group.Sum(i => i.MoneyRate), ProgramId = group.Key });

有关投影和匿名类型的详细信息,请阅读https://msdn.microsoft.com/en-us/library/bb397914.aspx