如何使用System.Dynamic.LINQ库GroupBy DateTime的一部分

时间:2015-08-04 18:43:43

标签: sql-server vb.net linq lambda dynamic-linq

我有包含很多行的表,每个记录都很好,由谁和添加的日期。 我想根据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

,我将不胜感激。

由于

1 个答案:

答案 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)")

现在效果很好。