使用来自qrouped数据的linq的条件平均值不返回任何内容

时间:2018-01-17 12:59:38

标签: c# linq group-by where

我使用linq计算数据中一个字段的平均值。我希望将我的结果分为两个其他字段。

var Table3 = from d in table1sum.Concat(table2sum)
group d by new { d.Field1, d.Field2 } into dg
    let AverageField3 = dg.Where(g => g.Field3 > 0.0).Average(g => g.Field3)
    let Field4Sum = dg.Sum(g => g.Field4)
    let Field5Sum = dg.Sum(g => g.Field5)
    let Field6Sum = dg.Sum(g => g.Field6)
select new
{
    SupplierID = dg.Key.Field1,
    PropertyID = dg.Key.Field2,
    AverageField3,
    Field4Sum,
    Field5Sum,
    Field6Sum
 };

原始数据

Table1Sum
    Field1  |Field2 |Field3 |Field4     |Field5 |Field6
    3       |3      |48,00  |3019,00    |603,80 |0,00
    3       |4      |51,00  |3144,00    |628,80 |0,00
    3       |5      |49,00  |3085,00    |617,00 |0,00
    3       |5      |49,00  |3062,00    |612,40 |0,00
    3       |7      |30,00  |42,00      |8,40   |0,00


Table2Sum
    Field1  |Field2 |Field3 |Field4     |Field5 |Field6
    6       |4      |0,00   |0,00       |0,00   |959,80
    4       |7      |0,00   |0,00       |0,00   |529,25
    1       |3      |0,00   |0,00       |0,00   |1730,45
    1       |7      |0,00   |0,00       |0,00   |2127,21
    2       |5      |0,00   |0,00       |0,00   |239,63
    1       |5      |0,00   |0,00       |0,00   |867,23
    6       |3      |0,00   |0,00       |0,00   |501,20
    2       |3      |0,00   |0,00       |0,00   |354,63
    3       |4      |0,00   |0,00       |0,00   |541,54
    3       |3      |0,00   |0,00       |0,00   |683,85
    6       |5      |0,00   |0,00       |0,00   |511,73
    4       |5      |0,00   |0,00       |0,00   |1023,17     

出于某种原因,我得到错误"序列不包含任何元素"。

我想要的是

Table3
    Field1  |Field2 |Field3 |Field4     |Field5     |Field6
    3       |3      |48,00  |3019,00    |603,80     |683,85
    3       |4      |51,00  |3144,00    |628,80     |541,54
    3       |5      |49,00  |6147,00    |1229,40    |0,00
    3       |7      |30,00  |42,00      |8,40       |0,00

如何更改我的linq查询以获取正确的数据?

编辑:问题和评论的一些答案。

'字段1'实际上还有其他值而不是3.这恰好是我此时的测试数据。

1 个答案:

答案 0 :(得分:4)

听起来有些团体没有任何物品满足Where条件。空的非可空值序列的Average不为零 - 这是一个例外。例如,Field1的{​​{1}}没有6的项Field3大于零。

我注意到你的#34;我想要什么"表格只有Field13的值 - 如果这代表您的真实情况,可能会过滤第二个表格。

可能的解决方法是将值投影为可为空的:

let AverageField3 = dg.Where(g => g.Field3 > 0.0).Average(g => (int?)g.Field3)

如果没有任何输入,这将给出null值。如果你想要零:

let AverageField3 = dg.Where(g => g.Field3 > 0.0)
                      .Average(g => (int?)g.Field3)
                      .GetValueOrDefault();

(将int?替换为float?decimal?或与您的数据匹配的任何内容)