Vb.net LINQ和按周分组

Vb.net LINQ和按周分组,vb.net,linq,Vb.net,Linq,我有一个字符串字段,其中包含一个日期,我将其转换为日期。我需要每周使用LINQ对其进行分组。我的最终目标是将其作为 年 周 周初从周一开始 BeginDateOfWeek将实际用于报告中。年和周是用来提供一个尚未编写的函数的,但一旦我弄明白了这一点,它将决定周初的日期信息 但是,当我将此日期字段分组为“年”和“周”,并使用两个名为I的函数时,我得到: 年=2020年,周=生成方法 我做了一个for-each,果然每周都列为week=generated方法 因此,我尝试重命名函数,只是对正在发生的

我有一个字符串字段,其中包含一个日期,我将其转换为日期。我需要每周使用LINQ对其进行分组。我的最终目标是将其作为

年 周 周初从周一开始

BeginDateOfWeek将实际用于报告中。年和周是用来提供一个尚未编写的函数的,但一旦我弄明白了这一点,它将决定周初的日期信息

但是,当我将此日期字段分组为“年”和“周”,并使用两个名为I的函数时,我得到:

年=2020年,周=生成方法

我做了一个for-each,果然每周都列为week=generated方法

因此,我尝试重命名函数,只是对正在发生的事情进行了简单的描述,因此我尝试在join子句中将其重命名为j,并得到错误:

错误BC36621“Equals”无法将“Function i As Object As Integer”类型的值与“Function j As Object As Integer”类型的值进行比较

因此,如果有人能帮助我,我将不胜感激。这是vb.net c解决方案,很好,不是Linq到实体,而是常规Linq。我真是束手无策

Dim query=来自tbl1组CCM中的CCM_ 按年份=CTypeCCM.LCDATE,Date.Year, Week=Functioni System.Globalization.CultureInfo.CurrentCulture.Calendar.GetWeekOfYeari.LCDATE,System.Globalization.CalendarWeekRule.FirstDay,DayOfWeek.Monday进入grp=组 组从tbl2中的CCTS加入CCT 集团CCTS_ By Year1=CTypeCCTS.CCDATE,Date.Year,Week1=Functionj System.Globalization.CultureInfo.CurrentCulture.Calendar.GetWeekOfYearj.CCDATE,System.Globalization.CalendarWeekRule.FirstDay,DayOfWeek.Monday 进入grp1=组 年等于CCT.Year1,周等于CCT.Week1 Into Merged=来自Merged.DefaultIfEmpty中CCT的组 使用{.YEAR=YEAR、.WEEK=WEEK、.MyTest=}选择新建
正如错误所说

(Function(i) System.Globalization.CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(i.LCDATE, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday))
它的对应物是功能

您需要实际执行这些功能:

(Function(i) System.Globalization.CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(i.LCDATE, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday))(CType(CCM.LCDATE, Date)) 
或者,最好在别处定义该函数,然后在查询中使用它:

Function getWeekOfYear (str As String) As Integer

    Return System.Globalization.CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(
        CType(str, Date), 
        System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday
    )

End Function


Dim query = 
    From CCM In tbl1 
    Group CCM By 
        Year = CType(CCM.LCDATE, Date).Year,
        Week = getWeekOfYear(CCM.LCDATE) Into grp = Group
        Group Join CCT In (
            From CCTS In tbl2
            Group CCTS By 
                Year1 = CType(CCTS.CCDATE, Date).Year, 
                Week1 = getWeekOfYear(CCTS.CCDATE)
                Into grp1 = Group
        ) 
        On Year Equals CCT.Year1 And Week Equals CCT.Week1
        Into Merged = Group 
    From CCT In Merged.DefaultIfEmpty()
    Select New With {.YEAR = Year, .WEEK = Week, .MyTest = ""}

正如错误所说

(Function(i) System.Globalization.CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(i.LCDATE, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday))
它的对应物是功能

您需要实际执行这些功能:

(Function(i) System.Globalization.CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(i.LCDATE, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday))(CType(CCM.LCDATE, Date)) 
或者,最好在别处定义该函数,然后在查询中使用它:

Function getWeekOfYear (str As String) As Integer

    Return System.Globalization.CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(
        CType(str, Date), 
        System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday
    )

End Function


Dim query = 
    From CCM In tbl1 
    Group CCM By 
        Year = CType(CCM.LCDATE, Date).Year,
        Week = getWeekOfYear(CCM.LCDATE) Into grp = Group
        Group Join CCT In (
            From CCTS In tbl2
            Group CCTS By 
                Year1 = CType(CCTS.CCDATE, Date).Year, 
                Week1 = getWeekOfYear(CCTS.CCDATE)
                Into grp1 = Group
        ) 
        On Year Equals CCT.Year1 And Week Equals CCT.Week1
        Into Merged = Group 
    From CCT In Merged.DefaultIfEmpty()
    Select New With {.YEAR = Year, .WEEK = Week, .MyTest = ""}

我测试了从今年第一个星期一开始的以下代码

       Dim Year As Integer = 2020
        Dim jan1 As New DateTime(Year, 1, 1)
        Dim firstMonday As DateTime = jan1.AddDays((8 - jan1.DayOfWeek) Mod 7)
        Dim firstMondayDayOfYear As Integer = firstMonday.DayOfYear

        Dim days As List(Of DateTime) = Enumerable.Range(0, 365).Select(Function(x) firstMonday.AddDays(x)).ToList()
        Dim weeks = days.GroupBy(Function(x) CType((x.DayOfYear - firstMondayDayOfYear) / 7, Integer)).ToList()
我将创建一个可以在linq中调用的函数

    Function GetWeek(day As DateTime) As Integer
        Dim Year As Integer = day.Year
        Dim jan1 As New DateTime(Year, 1, 1)
        Dim firstMonday As DateTime = jan1.AddDays((8 - jan1.DayOfWeek) Mod 7)
        Dim firstMondayDayOfYear As Integer = firstMonday.DayOfYear

        Dim week = CType((day.DayOfYear - firstMondayDayOfYear) / 7, Integer)
        Return week
    End Function

我测试了从今年第一个星期一开始的以下代码

       Dim Year As Integer = 2020
        Dim jan1 As New DateTime(Year, 1, 1)
        Dim firstMonday As DateTime = jan1.AddDays((8 - jan1.DayOfWeek) Mod 7)
        Dim firstMondayDayOfYear As Integer = firstMonday.DayOfYear

        Dim days As List(Of DateTime) = Enumerable.Range(0, 365).Select(Function(x) firstMonday.AddDays(x)).ToList()
        Dim weeks = days.GroupBy(Function(x) CType((x.DayOfYear - firstMondayDayOfYear) / 7, Integer)).ToList()
我将创建一个可以在linq中调用的函数

    Function GetWeek(day As DateTime) As Integer
        Dim Year As Integer = day.Year
        Dim jan1 As New DateTime(Year, 1, 1)
        Dim firstMonday As DateTime = jan1.AddDays((8 - jan1.DayOfWeek) Mod 7)
        Dim firstMondayDayOfYear As Integer = firstMonday.DayOfYear

        Dim week = CType((day.DayOfYear - firstMondayDayOfYear) / 7, Integer)
        Return week
    End Function

你能删除c标记吗?当然,但我说过c解决方案是受欢迎的。客户端需要vb.net。但我会的,我会试试这个@jdweng@djv标记为答案的。抱歉耽搁了。你能删除c标记吗?当然,但我说过欢迎使用c解决方案。客户端需要vb.net。但我会的,我会试试这个@jdweng@djv标记为答案的。对不起,耽搁了。你能展示一下在我的LINQ查询中如何使用它吗?你可以从LINQ调用函数。我更新了代码,使之成为一个单一的函数。你能告诉我如何在我的LINQ查询中使用它吗?你可以从LINQ调用函数。我更新了代码,使之成为一个单一的函数。不,我没有,但我希望我做了。解决办法是如此明显,我为此损失了整整一天的时间。但我把事情弄得更复杂了,然后又像往常一样变得必要。不,我没有,但我希望我做了。解决办法是如此明显,我为此损失了整整一天的时间。但我把它弄得更复杂了,然后像往常一样变得必要。