C#学习教程:带键的LINQgroupby语句我有下表:预约编号|用户名|任命集|任命已解决|任命状态|约会日期时间|1|1|2011年3月1日|2011年3月1日|2011|2011年3月5日|4|2011年3月16日|3|1|2011年3月2日|2011年3月11日|2|2011年3月7日|3|3/25/2011ApponintStatus是一个字节,其中1表示设置,2表示参加,3表示重新安排,4表示取消。AppointDatetime是设置约会的日期。我想要做的是创建以下输出,按天计算活动。日期|设置|参加|重新安排|已取消||2011年3月1日|1|||||2011年3月2日|2|||||5/2011||||1||2011年3月7日||1||||2011年3月11日|||1||这是我到目前为止所拥有的。TheDate是我正在查询的月份内的日期(即3月4日过去,应该返回3月表)年份&&appnt.AppointResolved.Month==TheDate.Month)||(appnt.AppointSet.Year==TheDate.Year&&appnt.AppointSet.Month==TheDate.Month)按appnt.AppointResolved.Date将appnt分组到日组中选择新的ViewMonthlyActivityModel(){ViewDate=(从日组中的d选择日组。Key.Date).First(),//这里的问题:需要获取约会设置但没有解决的实例的日期CountTotalSetOnDay=(fromcindaygroupswherec.AppointSet.Date==daygroups.Key//这里的问题选择c.AppointID).Count(),CountAttendedOnDay=(fromcindaygroupswherec.AppointResolved.Date==daygroups.Key.Datewherec.AppointStatus==2选择c.AppointID).Count(),其中之一问题是CountTotalSetOnDay只返回当天设置和解析的计数;另一个问题是ViewDate需要返回所有日期:没有约会设置但约会参加,重新安排或取消日期,反之亦然,有约会设置但是没有解决的日期现在我用2个查询运行它,我在其中加入结果:一个查询返回约会集,另一个返回已解决的约会。但是,我仍然坚持使用一个查询中的一个查询解决方案。有什么建议么?谢谢。您需要使用设置日期和解决日期进行分组。这可以通过添加另一个from子句以对一组日期进行交叉连接并按这些日期分组来轻松实现。下面的查询基于LINQtoObjects查询。LINQtoSQL不支持这种查询,因此您必须决定是要使用在客户端计算机还是服务器上运行的查询。constbytestatusAttended=2;constbytestatusRescheduled=3;constbytestatusCancelled=4;varquery=fromainMyDC.LeadsAppointments.AsEnumerable()fromdateinnew[]{a.AppointSet.Date,a.AppointResolved.Date}其中a.UserID==TheUserID&&date.Year==TheDate.Year&&date.Month==TheDate.Month按日期将a分组为gorderbyg.Keyletset=g.Distinct().ToList()selectnewViewMonthlyActivityModel{ViewDate=g.Key,CountTotalSetOnDay=set.Count(a=>a.AppointSet.Date==g.Key),CountTotalAttendedOnDay=set.Count(a=>a.AppointResolved.Date==g.Key&&a.AppointStatus==statusAttended),CountTotalRescheduledOnDay=set.Count(a=>a.AppointResolved.Date==g.Key&&a.AppointStatus==statusRescheduled),CountTotalCancelledOnDay=set.Count(a=>a.AppointResolved.Date==g.Key&&a.AppointStatus==statusCancelled),};否则,对于应该工作的完整LINQtoSQL解决方案(不是最干净的),您可以试试这个。可能有更好的方法来做到这一点,但我不知道。constbytestatusAttended=2;constbytestatusRescheduled=3;constbytestatusCancelled=4;varquery=来自MyDC.LeadsAppointments中的setDate=来自MyDC.LeadsAppointments中的aa,其中aa.AppointID==a.AppointID选择aa.AppointSet.Date让resolvedDate=来自MyDC.LeadsAppointments中的aa,其中aa.AppointID==a.AppointID从setDate.Concat(resolvedDate)中的日期中选择aa.AppointResolved.Date,其中a.UserID==TheUserID&&date.Year==TheDate.Year&&date.Month==TheDate.Month按日期将a分组为gorderbyg。Key让set=g.Distinct()选择新的ViewMonthlyActivityModel{ViewDate=g.Key,CountTotalSetOnDay=set.Count(a=>a.AppointSet.Date==g.Key),CountTotalAttendedOnDay=set.Count(a=>a.AppointResolved.Date==g.Key&&a.AppointStatus==statusAttended),CountTotalRescheduledOnDay=set.Count(a=>a.AppointResolved.Date==g.Key&&a.AppointStatus==statusRescheduled),CountTotalCancelledOnDay=set.Count(a=>a.AppointResolved.Date==g.Key&&a.AppointStatus==statusCancelled),};您正在按AppointResolved.Date分组因此,对于daygroups中的每个条目,daygroups.Key==AppointResolved.Date和c.AppointSet.Date==daygroups.Keywhere子句只会为您提供当天有约会设置的所有条目的决议。在我看来,如果你想实现既定目标,你必须在你的表格的任何字段中列出所有提到的日期并计算它们。例如,考虑:varappointmentsTaken=(fromappntinGoyaDC.LeadsAppointmentswhere...//yourfiltersgroupappntbyappnt.AppointSet.Dateintodayssetselect{Date=daysset.KeyCount=daysset.Count()}这应该是你提供约会的设定日期列表,以及每个约会的约会数量。我猜一个带有2个读取查询的解决方案工作正常,现在是代表。以上是C#学习教程:LINQ的全部内容key分享的groupby语句,如果对你有用,需要了解更多C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权请点击维权联系管理员删除如有转载请注明出处:
