我有包含很多行的表,每个记录都很好,由谁和添加的日期。 我想根据AddedBy和AddedOn字段对所有记录进行分组。
问题是日期是完整的,包括毫秒,我只想按天,月或年分组。
我在此注意到在编译时我不知道它是哪个表,因此我使用System.Dynamic.LINQ库。
下面我将演示如何使用System.Dynamic.LINQ库按日期时间进行分组:
Dim groupColl= myColl.GroupBy("new(AddedName, AddedOn), it").Select("new(Key.AddedName, Key.AddedOn, Count() AS Count)")
但问题是我需要按日,月或年进行分组。
在sql server中,我发现了如何按日,按月或按年进行操作。 在Lambda Expression中也找到了如何做到的方式,但只是白天。
但是通过System.Dynamic.LINQ找不到任何方法。
下面我将演示如何在sql server和Lambda Expression中执行此操作:
使用SQL SERVER:
SELECT AddedBy, DATEADD(DAY, DATEDIFF(DAY, 0, AddedOn), 0) as AddedOn, count(*)
FROM myTable
GROUP BY AddedBy, DATEADD(DAY, DATEDIFF(DAY, 0, AddedOn), 0)
使用Lambda Expression vb.net代码
Dim groupColl = myCollection.GroupBy(Function(x) New With {Key x.AddedBy, Key .AddedeOn_Day = DbFunctions.TruncateTime(x.AddedOn)}).Select(Function(y) New With {y.Key.AddedBy, y.Key.AddedeOn_Day, y.Count})
如果有人帮我使用System.Dynamic.LINQ Library
,我将不胜感激。由于
答案 0 :(得分:0)
我找到了解决方案! 我的解决方案基础在这里找到:
Using DateDiff with Linq.Dynamic library for fetching today records
使用Lambda表达式
Dim groupColl = myColl.GroupBy(Function(x) New With {Key x.AddedBy, Key .AddedeOn_Month = DbFunctions.CreateDateTime(x.AddedOn.Year, x.AddedOn.Year, x.AddedOn.Month, 1, 0, 0.0)}).Select(Function(y) New With {y.Key.AddedBy, y.Key.AddedeOn_Month , y.Count})
我在System.Dynamic.Linq中添加了以下行来识别DbFunctions:
Dim type = GetType(DynamicQueryable).Assembly.[GetType]("System.Linq.Dynamic.ExpressionParser")
Dim field = type.GetField("predefinedTypes", BindingFlags.[Static] Or BindingFlags.NonPublic)
Dim predefinedTypes = DirectCast(field.GetValue(Nothing), Type())
Array.Resize(predefinedTypes, predefinedTypes.Length + 1)
predefinedTypes(predefinedTypes.Length - 1) = GetType(DbFunctions)
field.SetValue(Nothing, predefinedTypes)
然后我补充道:
Dim groupColl = myColl.GroupBy("new(AddedName, DbFunctions.CreateDateTime(AddedOn.Year, AddedOn.Month, 1, 0, 0, 0.0) AS AddedOn_Month), it").Select("new(Key.AddedName, Key.AddedOn_Month, Count() AS Count)")
现在效果很好。