如何使用linq按星期和星期几对日期进行分组?

时间:2018-12-31 11:05:59

标签: c# linq

我有应该按周和工作日对行进行计数的数据。结果我应该得到

一周中的第一天,工作日以及该天的数据计数

我尝试了以下代码:

var GroupedByDate = from r in dsDta.Tables[0].Rows.Cast<DataRow>()
                        let eventTime = (DateTime)r["EntryTime"]
                        group r by new
                        {
                            WeekStart = DateTime(eventTime.Year, eventTime.Month, eventTime.AddDays(-(int)eventTime.DayOfWeek).Day),
                            WeekDay = eventTime.DayOfWeek
                        } 
                        into g
                        select new
                        {
                            g.Key,
                            g.WeekStart,
                            g.WeekDay,
                            LoadCount = g.Count()
                        };

但是,从DateTime(eventTime.Year,...) 我收到错误消息“不能将C#不可使用的成员datetime用作方法。”

该怎么做?

1 个答案:

答案 0 :(得分:6)

立即出现错误是由于您在构造函数调用中缺少new部分。但是,即使这样,即使您使用现有日期的月份和年份,即使一周的开始是在上一个月份或年份,您仍然会遇到问题。

幸运的是,您可以轻松简化它:

group r by new
{
    WeekStart = eventTime.AddDays(-(int)eventTime.DayOfWeek)),
    WeekDay = eventTime.DayOfWeek
}

或者如果eventTime并不总是日期,请使用eventTime.Date.AddDays(...)

或者,为清楚起见,您可以提取一个单独的方法:

group r by new
{
    WeekStart = GetStartOfWeek(eventTime)
    WeekDay = eventTime.DayOfWeek
}

...

private static DateTime GetStartOfWeek(DateTime date)
{
    // Whatever implementation you want
}

这样,您可以分别测试GetStartOfWeek的实现,并且在不影响查询的情况下也可以使其更加复杂。