分组依据未汇总

时间:2015-08-27 02:54:13

标签: c# linq

我正在汇总从多个相同的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;

        }
    }
}

1 个答案:

答案 0 :(得分:2)

您需要覆盖Equals课程上的GetHashCodeMetric。大多数Linq方法使用哈希码进行比较操作,因此对于您自己定义的大多数对象,如果您打算使用GroupByUnion等内容,则需要覆盖此类。