var groupedResultCurrentShift =
currentShift.SelectGrouped(t=>t.Medium, t.MeasurementTime, t.VolumenInTanks);
没有意义,因为t
第二个和第三个子句的 the 没有定义,并且VolumenInTanks
与您尚未创建的属性相关。
我们还有一个问题,因为Select
您的查询中的 与之前在同一范围内定义的匿名对象有关。这阻止了我们定义一个方法,让我们传入一个定义应该选择什么的 lambda。
然而:
currentShift.FilingMeasurements
.Where(f => TimeSpan.Parse(f.MeasurementTime.MeasurementTime) == ShiftEnd)
.GroupBy(f => new { f.Medium, f.MeasurementTime })
.Select(t => new { t.Key.Medium, t.Key.MeasurementTime, VolumeInTanks = t.Sum(s => s.Filing) })
.ToList();
相当于;
currentShift.FilingMeasurements
.Where(f => TimeSpan.Parse(f.MeasurementTime.MeasurementTime) == ShiftEnd)
.GroupBy(f => new { f.Medium, f.MeasurementTime }, s => s.Filing)
.Select(t => new { t.Key.Medium, t.Key.MeasurementTime, VolumeInTanks = t.Sum() })
.ToList();
现在,这还不完全存在,但让我们考虑一下,我们从以下位置获得了相同的信息:
currentShift.FilingMeasurements
.Where(f => TimeSpan.Parse(f.MeasurementTime.MeasurementTime) == ShiftEnd)
.GroupBy(f => new { f.Medium, f.MeasurementTime }, s => s.Filing)
.Select(t => new { t.Key, VolumeInTanks = t.Sum() })
.ToList();
所以。如果您愿意做item.Key.Medium
而不是item.Medium
,那么我们在做生意:
我们需要一个返回类型,所以我们将创建一个:
public class GroupedCount<T>
{
public<T> Key{get;set;}
public int Count{get;set;}//bit more of a general-purpose name than VolumeInTanks
}
现在,创建我们的方法:
public static List<GroupedCount<TKey>> ToGroupedCounts<TSource, TKey>(this IQueryable<TSource> source, Func<TSource, bool> pred, Func<TSource, TKey> keyGen, Func<TSource, int> tallyGen)
{
currentShift.FilingMeasurements
.Where(pred)
.GroupBy(keyGen, tallyGen)
.Select(t => new GroupedCount<TKey>{ Key = t.Key, Count = t.Sum() })
.ToList();
}
我们现在可以调用:
currentShift.ToGroupedCounts(
f => TimeSpan.Parse(f.MeasurementTime.MeasurementTime) == ShiftEnd,
f => new { f.Medium, f.MeasurementTime },
s => s.Filing
);
由于我们希望这是通用ToList()
的,除非在特定情况下确实需要它,否则不应调用它,因此返回 IQueryable 更有意义:
public static IQueryable<GroupedCount<TKey>> ToGroupedCounts<TSource, TKey>(this IQueryable<TSource> source, Func<TSource, bool> pred, Func<TSource, TKey> keyGen, Func<TSource, int> tallyGen)
{
currentShift.FilingMeasurements
.Where(pred)
.GroupBy(keyGen, tallyGen)
.Select(t => new GroupedCount<TKey>{ Key = t.Key, Count = t.Sum() });
}