Vb.net LINQ和按周分组
我有一个字符串字段,其中包含一个日期,我将其转换为日期。我需要每周使用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=}选择新建Vb.net LINQ和按周分组,vb.net,linq,Vb.net,Linq,我有一个字符串字段,其中包含一个日期,我将其转换为日期。我需要每周使用LINQ对其进行分组。我的最终目标是将其作为 年 周 周初从周一开始 BeginDateOfWeek将实际用于报告中。年和周是用来提供一个尚未编写的函数的,但一旦我弄明白了这一点,它将决定周初的日期信息 但是,当我将此日期字段分组为“年”和“周”,并使用两个名为I的函数时,我得到: 年=2020年,周=生成方法 我做了一个for-each,果然每周都列为week=generated方法 因此,我尝试重命名函数,只是对正在发生的
正如错误所说
(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调用函数。我更新了代码,使之成为一个单一的函数。不,我没有,但我希望我做了。解决办法是如此明显,我为此损失了整整一天的时间。但我把事情弄得更复杂了,然后又像往常一样变得必要。不,我没有,但我希望我做了。解决办法是如此明显,我为此损失了整整一天的时间。但我把它弄得更复杂了,然后像往常一样变得必要。