通过在linq中选择max来分组

时间:2013-02-18 08:38:10

标签: c# linq

我试图找出如何做到但仍然与Linq sytax混淆。

我的目的是使用指定的empCode

找到max effectiveDate
var x = (from workingResult in this.DataWorkspace.ApplicationData.WorkingResults
         group workingResult by workingResult.EmployeeCode into g
         where g.EmployeeCode == employeeCode
         && (g.EffectiveDate.HasValue
         && g.EffectiveDate.Value.Equals(date))
         select new {EffectiveDate = g.Max(d=>d.EffectiveDate)});

但编译器向我显示了这个

"找不到源类型' ...'的查询模式的实现。 '的GroupBy'未找到。考虑明确指定范围变量' workingResult'的类型。 "

这是什么意思?我真的需要你的帮助。 谢谢。

2 个答案:

答案 0 :(得分:1)

您的代码的问题在于您将组g视为单个workingResult。实际上它是一个列表。此外,g.EffectiveDate.Value.Equals(date)的目的是什么?如果不存在与date变量匹配的生效日期,则会导致最大生效日期始终为date或没有任何内容。

以下内容应该有效:

DataWorkspace.ApplicationData.WorkingResults
             .Where(x => x.EmployeeCode == employeeCode)
             .Max(x => x.EffectiveDate);

这将返回指定EffectiveDate的最大employeeCode

答案 1 :(得分:1)

where g.EmployeeCode == employeeCode行无效。 g的类型为IEnumerable<IGrouping<_EmployeeCode type_, _Working result type_>>。请尝试以下方法:

var x = from g2 in (from workingResult in this.DataWorkspace.ApplicationData.WorkingResults
                    group workingResult by workingResult.EmployeeCode into g
                    select g)
        select new {EmployeeCode = g2.Select(w => w.EmployeeCode), MaxEffectiveDate = g2.Max(w => w.EffectiveDate)};

现在x每个IEnumerable<_EmployeeCode type_, _Effective data type_>包含EffectiveDateEmployeeCode