将具有聚合的Linq查询绑定到ListView WPF C#

时间:2019-02-28 18:28:39

标签: c# sql wpf linq xaml

我有一个“ TimePunch”类,它记录每个用户的进/出时间配对以及一个标志级别,该标志级别继承自INotify并具有许多绒毛的公共获取/返回,为简单起见,将忽略这些信息。 / p>

{
    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;
...

我将这些集合绑定为列表视图的基础源,并具有许多类似于标签的按钮,以使Manager可以切换他们正在查看的是星期几,并且可以更改周末日期和每个用户的过滤条件。好吧,一切都很好,花花公子。

我想做的是将第二个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中做到这一点?

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

2 个答案:

答案 0 :(得分:0)

此建议是改为使用ADO.Net并调用已设置为从Azure / SQL Server返回JSON的存储过程。然后将从sproc返回的JSON反序列化为结构/实例,然后绑定到适当的listview。

  1. 在Azure DB中创建存储过程,并在选择结束时通过For JSON Auto返回正确的DTO /模型。
  2. 运行sproc并提取JSON数据示例。
  3. 转到JSON2CSharp并粘贴JSON以创建DTO对象。
  4. 将类放入您的项目中。
  5. 在项目中放入对存储过程的调用。可以在此.Net核心Nuget页面(SQLJSONReader)上找到示例。页面
  6. 可以找到该项目的读者SQLExtensions.cs,并且可以毫无问题地将其复制到您的.Net代码中。 我编写了Nuget程序包/代码,但尚未创建.Net版本
  7. 请注意,您可以使用Microsoft的XmlReader,但它会在JSON转义时使用barfs,并且无法处理2033个字符的数据返回。
  8. 该示例返回一个string,它将是原始JSON。需要将其反序列化到您的列表中。

完成此操作后,您可以调用您的sproc,获取正确的数据并按原样绑定该数据。

答案 1 :(得分:0)

我认为您想要这样的东西:

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.