C#linq改变了构造函数无法添加新值

时间:2016-08-10 08:15:31

标签: c# entity-framework linq

我是LinQ的新手,并在几周前开始使用它。所以也许我对LinQ如何工作有错误的理解。我还尝试使用如下所述的空构造函数:Invoke constructor inside a linq query

我改变了一个类的构造函数。我添加了实体energyType

public CSVMeter(int meterID, DateTime datum, int numberOfValues, double total, double total2, double qualityScore, int energyType)
    {
        this.MeterID = meterID;
        this.Datum = datum;
        this.NumberOfValues = numberOfValues;
        this.total = total;
        this.total2 = total2;
        this.qualityScore = qualityScore;
        this.energyType = energyType;
    }

我有以下LinQ查询。

 public List<CSVMeter> getDisctinctMeters(List<CSVMeter> meterList)
    {
                    newMeterList = newMeterList.GroupBy(x => new { x.MeterID, x.Datum })
            .Select(x => new CSVMeter(
                x.Key.MeterID, 
                x.Key.Datum, 
                x.Sum(s => s.NumberOfValues), 
                x.Sum(s => s.total), 
                x.Sum(s => s.total2), 
                0, 
                x.energyType))
                .ToList();

        return meterList;

    }

但是我在x.energyType

收到以下错误
  

错误2&#39; System.Linq.IGrouping&#39;不包含&#39; energyType&#39;的定义没有扩展方法&#39; energyType&#39;接受类型&#39; System.Linq.IGrouping&#39;的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)c:\ users \ rudi \ documents \ visual studio 2013 \ projects \ plooscassandra \ plooscassandra \ handlers \ meterbuilder.cs 108 136 PloosCassandra

为什么我找不到x.energyType

2 个答案:

答案 0 :(得分:2)

自您进行分组后,x的lambda中的SelectIGrouping<CsvMeter> - 而不是 {{1} }。

CsvMeter具有您在上面创建的匿名类型的IGrouping<CsvMeter>属性,并进一步表示Key个实例的序列。

由于您已经对该序列进行了CsvMeter次操作,因此您实际应该知道这一点。问题是,您希望汇总序列中所有Sum个实例的energyType,以评估生成的新CsvMeter的{​​{1}} 。以下是如何简单地使用组中第一个元素的energyType

CsvMeter

energyType返回组中的第一个newMeterList.GroupBy(x => new { x.MeterID, x.Datum }) .Select(x => new CSVMeter( x.Key.MeterID, x.Key.Datum, x.Sum(s => s.NumberOfValues), x.Sum(s => s.total), x.Sum(s => s.total2), 0, x.First().energyType)) .ToList(); 实例。

但也许你真的想用这种能量类型对First()个实例进行分组。所以你可以将分组改为

CsvMeter

并在CsvMeter

中使用该值
newMeterList.GroupBy(x => new { x.MeterID, x.Datum, x.energyType })
      //...

BTW你的代码看起来有点奇怪:你的Select接受一个名为.Select(x => new CSVMeter( x.Key.MeterID, x.Key.Datum, x.Sum(s => s.NumberOfValues), x.Sum(s => s.total), x.Sum(s => s.total2), 0, x.Key.energyType)) 的参数,并且返回时没有任何变化。相反,你使用一些getDisctinctMeters并没有显示它的声明。对于我的回答,我认为你的意图是:

meterList

答案 1 :(得分:1)

GroupBy的返回类型为IGouping,代表群组本身,而不是IEnumerable<CSVMeter>,因此x没有属性energyType。话虽如此,你必须澄清该组的哪个成员必须选择energyType;分组表达式中未使用energyType