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

C# 将带有聚合的Linq查询绑定到ListView WPF C,c#,sql,wpf,linq,xaml,C#,Sql,Wpf,Linq,Xaml,我有一个类TimePunch,它记录每个用户的输入/输出时间对,还有一个标志级别,它继承自INotify,并有一些为简单起见将被省略的fluff public get/returns { private int ID; private string UserID = App.Username; private DateTime TimeIn; private DateTime TimeOut; private int Flag = 0; //0 = Non

我有一个类TimePunch,它记录每个用户的输入/输出时间对,还有一个标志级别,它继承自INotify,并有一些为简单起见将被省略的fluff public get/returns

{
    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的基础源,并有许多按钮,这些按钮的作用类似于选项卡,允许经理切换他们查看的是一周中的哪一天,还有一个用于更改周末日期和按用户筛选的控件。好的,一切都很好

我想做的是将第二个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有没有干净的方法


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

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

在Azure DB中创建一个存储过程,并通过select末尾的For JSON Auto返回正确的DTO/模型。 运行存储过程并提取JSON数据的示例。 转到并粘贴JSON以创建DTO对象。 把课程放在你的项目中。 在项目中加入对存储过程的调用。在这个.Net核心Nuget页面上可以找到一个例子。页面 可以找到该项目的阅读器,并将其复制到您的.Net代码中,不会出现任何问题。我编写了Nuget包/代码,但还没有创建.Net版本。 注意:您可以使用Microsoft的XmlReader,但它会在JSON转义上呕吐,并且无法处理2033个字符的数据返回。 该示例返回一个字符串,该字符串将是原始JSON。这将需要反序列化到您的列表中。
完成此操作后,您可以调用存储过程,获取正确的数据并将这些数据本身绑定。

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

在Azure DB中创建一个存储过程,并通过select末尾的For JSON Auto返回正确的DTO/模型。 运行存储过程并提取JSON数据的示例。 转到并粘贴JSON以创建DTO对象。 把课程放在你的项目中。 在项目中加入对存储过程的调用。在这个.Net核心Nuget页面上可以找到一个例子。页面 可以找到该项目的阅读器,并将其复制到您的.Net代码中,不会出现任何问题。我编写了Nuget包/代码,但还没有创建.Net版本。 注意:您可以使用Microsoft的XmlReader,但它会在JSON转义上呕吐,并且无法处理2033个字符的数据返回。 该示例返回一个字符串,该字符串将是原始JSON。这将需要反序列化到您的列表中。
完成此操作后,您可以调用存储过程,获取正确的数据并将这些数据绑定到存储过程中。

我想您需要这样的功能:

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.

我想你想要这样的东西:

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.

EF已退出,但您是说没有数据库交互,还是只是不使用EF?还有,您提到的实例中的所有数据都是本地可用的,只需要汇总一下就可以了吗?我正在使用一个Azure SQL部署,它不能很好地与实体框架配合使用。相反,我编写了一个自定义类来处理所有连接和交换。相关的数据库记录作为对象集合在本地下载和缓存,从理论上讲,我应该能够使用LINQ以与使用SQL处理它们的源记录类似的方式进行操作。。。我的主要问题是语法,因为到目前为止我所做的尝试只是输出列表列表,然后需要额外的C编码和合并以获得所需的输出…EF已退出,但您是说没有数据库交互,还是只是不使用EF?还有,您提到的实例中的所有数据都是本地可用的,只需要汇总一下就可以了吗?我正在使用一个Azure SQL部署,它不能很好地与实体框架配合使用。相反,我编写了一个自定义类来处理所有连接和交换。相关的数据库记录作为对象集合在本地下载和缓存,从理论上讲,我应该能够使用LINQ以与使用SQL处理它们的源记录类似的方式进行操作。。。我的主要问题是语法,因为到目前为止我所做的尝试只是输出列表列表,然后需要额外的C编码和合并来获得所需的输出…花了一点时间来完成这一切,但这非常有效,有助于我理解LINQ的语法。授予的item.UserID在那里出现了两次。Tha
nks!!:@BlackHatCS yw-很高兴它很有帮助。花了一点时间把它全部敲定,但这很好地工作了,帮助我理解了LINQ的语法。授予的item.UserID在那里出现了两次。谢谢!!:@BlackHatCS yw-很高兴这对你有帮助。