LINQ - 按日期分组,过滤和选择

时间:2014-08-14 17:39:23

标签: .net vb.net linq

我对LINQ相对较新,可以使用一些帮助。鉴于以下结构:

Public Class BaseRate
    Public Property EffectiveDate As DateTime
    Public Property PayRate As Decimal
End Class

我有一个IEnumerable(Of BaseRate)来容纳几个对象。集合中可能有重复日期的数据,有些可能没有。我的业务要求如下:

  1. 使用BaseRate过滤掉所有EffectiveDate.Date > objDate.Date个对象(函数中提供objDate
  2. 在剩下的对象中,按降序排序并抓住最高的"来自该集合的EffectiveDate.Date
  3. 抓取所有匹配"最高"的BaseRate个对象EffectiveDate.Date
  4. 返回该集合
  5. 我以为我正在接近以下内容:

    Dim distinct_dates As IEnumerable(Of IGrouping(Of DateTime, BaseRate)) _
                     = Me.GroupBy(Function(o) o.EffectiveDate.Date)
    
    Dim active_at_date As IEnumerable(Of BaseRate) = distinct_dates.Select( _
                Function(grp) grp.OrderByDescending( _
                Function(o) o.EffectiveDate.Date).Where( _
                Function(o) o.EffectiveDate.Date <= objDate.Date))
    

    然而,我收到此错误:

      

    无法转换类型&#39; WhereSelectEnumerableIterator`2 [System.Linq.IGrouping`2 [System.DateTime,BaseRate],System.Collections.Generic.IEnumerable`1 [BaseRate]]&#39;输入&#39; System.Collections.Generic.IEnumerable`1 [BaseRate]&#39;。

    我确定我的订单错误,但不确定是什么。

    我是用VB.NET和方法语法完成的,但可以随意回复。我可以根据需要翻译。

1 个答案:

答案 0 :(得分:0)

我认为你只是缺少FirstOrDefault电话。

LINQ在C#中看起来更清晰,所以我的答案将在C#中,正如你所说,你可以把它翻译成VB。

var results = source.Where(x => x.EffectiveDate.Date > objDate.Date)
                    .GroupBy(x => x.EffectiveDate)
                    .OrderByDescending(g => g.Key)
                    .FirstOrDefault()