首页 > 解决方案 > 将带有聚合的 Linq 查询绑定到 ListView WPF C#

问题描述

我有一个类“TimePunch”,它记录每个用户的输入/输出时间配对以及一个标志级别,它继承自 INotify 并具有许多蓬松的公共获取/返回,为简单起见将省略。

{
    private int ID;
    private string UserID = App.Username;
    private DateTime TimeIn;
    private DateTime TimeOut;
    private int Flag = 0; //0 = None, 1 = Manual, 2 = Edited, 3 = Unlikely, -1 = Deleted
    private string Notes;
...

我将这些集合作为列表视图的基础源绑定,并有许多按钮,它们的作用类似于选项卡,以允许经理切换他们正在查看的星期几,并且有一个用于更改周末日期和过滤的控件每个用户。好的,一切都很好,花花公子。

我想要做的是将第二个 listView 绑定到一个查询,该查询通过总结每个员工每天的工作时间来显示数据源的一种“概述”。(TimePunch 的 myHoursView 返回 TimeIn/TimeOut 之间的小数小时数)

在 SQL 中,我正在寻找的伪代码类似于:

SELECT UserID, 
MAX(FlagView) As Flag, --'FlagView' ignores -1 or deleted records
SUM(CASE WHEN myTimeIn.DayofWeek = DayofWeek.Monday
    THEN myHoursView Else 0 END) As Monday, 
SUM(CASE WHEN myTimeIn.DayofWeek = DayofWeek.Tuesday  
    THEN myHoursView Else 0 END) As Tuesday,
...
SUM(myHoursView) As Total  
FROM PunchList  
WHERE TimeIn > WeekEnding.AddDays(-7) AND
   <= WeekEnding 
GROUP BY UserID

有没有办法在 LINQ 中干净地做到这一点?

(实体框架是不可能的——主要是为了兼容性)

标签: c#sqlwpflinqxaml

解决方案


我想你想要这样的东西:

var result = yourlist.GroupBy(
                 item => item.UserId,
                 item => item.UserId,
                 (key, items) => new { UserId = key,
                                       flag = items.Any(x => x.flag),
                                       monday = items.Where(x => x.DayOfWeek == monday).Sum(x => x.myHoursView), 
 // etc.

推荐阅读