我所拥有的是一个名为HourList的集合,它由Hour对象组成。一小时的两个属性是EmployeeId和Hours。员工进出并创建一小时记录。因此,在一周结束时,我将从DAO为多名员工提供一份mulipple Hour对象的HourList。要求在仅显示总小时数超过给定阈值的员工的情况下进行报告。
示例:一个简单而扁平的HourList
Id | Hours ---------- 1 | 4.5 2 | 6.0 3 | 9.9 1 | 5.5 2 | 2.5
阈值是10.在这种情况下,我只想要一个Id 1小时的记录,因为他的总计小时数超过10个。
我知道我可以通过在返回初始HourList时创建一个新的DAO方法来处理这个问题。我也可以使用foreach语句非常低效地完成这项工作。我试图通过Linq变得更好,并希望看到什么是可能的。感谢您提前提供任何帮助。
答案 0 :(得分:4)
var filtered = HourList.GroupBy(h => h.id)
.Select(g => new { Id = g.Key,
Hours = g.Sum(h => h.Hours)
})
.Where(h => h.Hours >= 10);
无法测试,但这应该让你接近。
答案 1 :(得分:2)
这是一个简单的例子,可以完成您的工作:
class Program
{
public class HourEntry
{
public int Id { get; set; }
public int Hours { get; set; }
}
static void Main(string[] args)
{
List<HourEntry> hours = new List<HourEntry>
{
new HourEntry { Id = 1, Hours = 3 },
new HourEntry { Id = 2, Hours = 4 },
new HourEntry { Id = 3, Hours = 3 },
new HourEntry { Id = 1, Hours = 8 },
new HourEntry { Id = 5, Hours = 2 },
new HourEntry { Id = 3, Hours = 2 },
new HourEntry { Id = 3, Hours = 6 },
new HourEntry { Id = 9, Hours = 2 },
new HourEntry { Id = 4, Hours = 2 },
};
var moreThanTen = from h in hours
group h by h.Id into hGroup
where hGroup.Sum(hg => hg.Hours) > 10
select hGroup.Key;
foreach (var m in moreThanTen)
{
Console.WriteLine(m);
}
}
}
答案 2 :(得分:1)
var hourList = new List<Hour>()
{
new Hour() { Id = 1, Hours = 4.5M},
new Hour() { Id = 2, Hours = 6M},
new Hour() { Id = 3, Hours = 9.9M},
new Hour() { Id = 1, Hours = 5.5M},
new Hour() { Id = 2, Hours = 2.5M}
};
var over10 = hourList.GroupBy(h => h.Id).Select( h => new { Id = h.Key, Sum = h.Sum( s => s.Hours )}).Where( x => x.Sum >= 10 );