在操作方法中,我有以下查询:
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 完成吗?
加入两个集合后,您可以按名字和姓氏对结果进行分组,并计算时间间隔的总和:
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)
}
> @Sergey给出的答案是正确的。
此答案适用于问题的编辑版本
您得到的错误是因为当您有一个参数化构造函数时缺少默认构造函数。
您可以通过在视图模型中包含无参数构造函数来避免它
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));