Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Linq to SQL中按周分组(周数)_C#_Sql Server_Vb.net_Linq To Sql_Week Number - Fatal编程技术网

C# 在Linq to SQL中按周分组(周数)

C# 在Linq to SQL中按周分组(周数),c#,sql-server,vb.net,linq-to-sql,week-number,C#,Sql Server,Vb.net,Linq To Sql,Week Number,在常规SQL中,我可以执行以下操作 SELECT * From T GROUP BY DATEPART(wk, T.Date) 在LINQtoSQL中如何实现这一点 下面的方法不起作用 From F In DB.T Group R By DatePart(DateInterval.WeekOfYear, F.Date) 也不起作用: From F In DB.T Group R By (F.Date.DayOfYear / 7) 这是正确的 from F in DB.T group F b

在常规SQL中,我可以执行以下操作

SELECT * From T GROUP BY DATEPART(wk, T.Date)
在LINQtoSQL中如何实现这一点

下面的方法不起作用

From F In DB.T Group R By DatePart(DateInterval.WeekOfYear, F.Date)
也不起作用:

From F In DB.T Group R By (F.Date.DayOfYear / 7)
这是正确的

from F in DB.T group F by F.Date.DayOfYear / 7;

您不正确地指定了组。此代码的结果是对象的集合。每个对象都有一个键属性,该属性是您分组的依据(在本例中为
F.Date.DayOfYear/7
。每个对象都是T中满足分组条件的对象的集合。

如果您关心区域性,则在以下代码中您将考虑到这一点:

var ci = CultureInfo.CurrentCulture;
var cal = ci.Calendar;
var rule = ci.DateTimeFormat.CalendarWeekRule;
var firstDayOfWeek = ci.DateTimeFormat.FirstDayOfWeek;

var groups = from F in DB.T
             group F by cal.GetWeekOfYear(F, rule, firstDayOfWeek) into R
             select R;
不支持该方法,但您可能会创建一个TSQL。DayOfYear/7技巧应该适用于大多数情况,并且更易于使用。下面是我最后得到的代码:

var x = from F in DB.T
        group F by new {Year = F.Date.Year, Week = Math.Floor((decimal)F.Date.DayOfYear / 7)} into FGroup
        orderby FGroup.Key.Year, FGroup.Key.Week
        select new {
            Year = FGroup.Key.Year,
            Week = FGroup.Key.Week,
            Count = FGroup.Count()
        };
结果如下:

Year    Week    Count
2004    46      3
2004    47      3
2004    48      3
2004    49      3
2004    50      2
2005    0       1
2005    1       8
2005    2       3
2005    3       1
2005    12      2
2005    13      2

首先,你应该知道一周中第一天的日期

获取一周中第一天的日期。 您可以使用以下代码:

public static class DateTimeExtensions
{
    public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        int diff = dt.DayOfWeek - startOfWeek;
        if (diff < 0)
        {
            diff += 7;
        }
        return dt.AddDays(-1 * diff).Date;
    }
}
可以像这样在LINQtoSQL中完成

T.GroupBy(i => i.Date.StartOfWeek(DayOfWeek.Monday));

您可以使用命名空间中的
SqlFunctions.DatePart
方法

// Return the week number
From F In DB.T Group R By SqlFunctions.DatePart("week", F.Date)

当你说它不起作用时,你是什么意思?不编译,不返回预期的结果?不编译..“范围变量名只能从没有参数的简单或限定名中推断出来。”好的,答案是“从DB.t组R中的F按WeekOfYear=(F.Date.DayOfYear/7)”这不起作用--“方法”Int32 GetWeekOfYear(System.DateTime,System.Globalization.CalendarWeekRule,System.DayOfWeek)“不支持转换为SQL”。在Linq2Sql或Linq to实体中,似乎不支持Calendar.GetWeekOfYear;您应该先提取设置的整个数据,然后使用cal.GetWeekOfYear(x,rule,firstDayOfWeek).是的..但是将DayOfYear除以7就足够了。谢谢!我所要做的就是“从DB.T组R中的F除以WeekOfYear=(F.Date.DayOfYear/7)”;)请记住,这不会直接对应于日历周,因为它假设一年总是从星期日开始。要完全匹配,您需要使用Calendar.WeekOfYear或将DatePart调用包装到SQL函数中
// Return the week number
From F In DB.T Group R By SqlFunctions.DatePart("week", F.Date)