Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 分组依据未聚合_C#_Linq - Fatal编程技术网

C# 分组依据未聚合

C# 分组依据未聚合,c#,linq,C#,Linq,我正在聚合从多个相同的web服务检索的数据。返回的行数和数据点相同,但值中只有一个差异。我使用的GroupBy子句没有压缩任何行。我在GroupBy前后都有相同的行数 MyWebServiceUrls .AsParallel() .SelectMany(url => GetMetricItemData(url)) .GroupBy(item => new { item.DateTime, item.Group, item.Metric }, item =>

我正在聚合从多个相同的web服务检索的数据。返回的行数和数据点相同,但值中只有一个差异。我使用的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();
根据我找到的其他示例,语法看起来是正确的

我将这些数据发送回我的数据库,并可以按[DateTime]、[GROUP]、[Metric]和语句组进行聚合,一切都很好。虽然我可以使用数据库来解决这个问题,但我想知道如何在这个实例中正确使用LINQ

要让这个LINQ表达式工作,我缺少什么

更新:

这是相关的公制项目和公制类定义:

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;

        }
    }
}

您需要在Metric类上重写Equals和GetHashCode。大多数Linq方法使用哈希代码进行比较操作,因此对于您自己定义的大多数对象,如果您计划使用GroupBy、Union等,则需要重写此类。

您当前的实现现在得到了什么?您的表达式看起来不错。你真的确定DateTime、Group和Metric实际上是相等的吗?需要MetricItem的类定义吗?当我按Metric字段分组而不是简单地按Metric分组时,我解决了这个问题。对于所有像我这样任性的linq新手来说,这是一个简单的不正确的平等性检查案例。这对我来说很有效!在这种情况下,我只需要覆盖Metric类的Equals和GetHashCode,因为我只对MetricItem对象中的字段子集进行分组。@CElliott Good!我应该提到的是,如果您没有覆盖这些对象,它会根据引用相等进行比较,这意味着这些对象实际上是同一个对象,而不仅仅是同一个值,因为您在group by中动态生成它们,这将是错误的。