我正在汇总从多个相同的Web服务检索的数据。返回相同的行计数和数据点,且Value
只有差异。我正在使用的GroupBy子句不会压缩任何行。我在GroupBy之前和之后都有相同的行数。
MyWebServiceUrls
.AsParallel()
.SelectMany(url => GetMetricItemData(url))
.GroupBy(item => new { item.DateTime, item.Group, item.Metric }, item => item.Value)
.Select(grp => new MetricItem()
{
DateTime = grp.Key.DateTime,
Group = grp.Key.Group,
Metric = grp.Key.Metric,
Value = // type = decimal?
grp.Any(mi => mi.HasValue)
? grp.Key.Metric.AggregationType == Metric.MetricAggregationTypes.Sum
? grp.Sum(mi => mi.Value)
: grp.Average(mi => mi)
: null
})
.AsEnumerable();
根据我找到的其他示例,语法看起来是正确的。
我将这些数据发送回我的数据库,并可以使用语句GROUP BY [DateTime], [Group], [Metric]
进行汇总,一切都很好。虽然我可以使用数据库来解决这个问题,但我想知道如何在这个实例中正确使用LINQ。
我错过了什么让这个LINQ表达式起作用?
更新:
这是相关的MetricItem和Metric类定义:
public class MetricItem
{
public string Group { get; set; }
public DateTime DateTime { get; set; }
public Metric Metric { get; set; }
public Decimal? Value { get; set; }
}
public class Metric
{
public string Code { get; set; }
public string Label { get; set; }
private List<string> SumMetrics = new List<string>(new string[] { "TPI", "TPO", "TPIO" });
public enum MetricAggregationTypes { Sum, Average };
public MetricAggregationTypes AggregationType
{
get
{
if (SumMetrics.IndexOf(this.Code) >= 0)
return MetricAggregationTypes.Sum;
else
return MetricAggregationTypes.Average;
}
}
}
答案 0 :(得分:2)
您需要覆盖Equals
课程上的GetHashCode
和Metric
。大多数Linq方法使用哈希码进行比较操作,因此对于您自己定义的大多数对象,如果您打算使用GroupBy
,Union
等内容,则需要覆盖此类。