汇总列表中所有记录的日期时间属性

时间:2017-02-06 22:04:33

标签: c# linq lambda

在动作方法中,我得到以下查询:

var list = listWRUD.
                Join(db.UsersDetails,
                o => o.UserDetailsId, od => od.identtyUserId,
                (o, od) => new
                {
                    fname = od.FirstName,
                    lname = od.LastName,
                    UserDetailsId = o.UserDetailsId,
                    FocusStart = o.FocusStart,
                    FocusEnd = o.FocusEnd
                }).ToList()

它基本上给了我一个包含大量重复名称的列表。

我想要实现(并且不知道如何)是RolesUsersViewModel类型的另一个列表:

public class RolesUsersViewModel
{
    public RolesUsersViewModel(string FirstName, string LastName, TimeSpan totalex)
    {
            fname = FirstName;
            lname = LastName;
            total = totalex;
    } 

    public string fname { get; set; }
    public string lname { get; set; }
    public TimeSpan total{ get; set; }
}

我的想法是,如果查询给我一个三个结果的列表,其中两个是同名的结果,最后得到一个包含两个条目的View模型列表,这将有累积时间。

有人能以某种方式帮助吗?这可以用lambda来完成吗?

2 个答案:

答案 0 :(得分:3)

加入两个集合后,您可以按名字和姓氏对结果进行分组,并计算时间间隔的总和:

from x in list
group x by new { x.fname, x.lname } into g
select new RolesUsersViewModel {
   fname = g.Key.fname,
   lname = g.Key.lname,
   total = g.Sum(x => x.FocusEnd - x.FocusStart)
}

答案 1 :(得分:0)

@Sergey给出的答案是正确的。

此答案适用于问题的编辑版本

您获得的错误是因为当您有参数化构造函数时缺少默认构造函数。

您可以通过在ViewModel

中包含无参数构造函数来避免它
 public RolesUsersViewModel()
{

}

或者通过将查询更改为

    from x in list
    group x by new { x.fname, x.lname } into g
    select new RolesUsersViewModel (g.Key.fname, g.Key.lname, g.Sum(x => x.FocusEnd - x.FocusStart));