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

Mar*_*ala 3 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
 };
Run Code Online (Sandbox Code Playgroud)

原始数据为

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     
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我收到错误“序列不包含元素”。

我想要的是

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
Run Code Online (Sandbox Code Playgroud)

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

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

'Field1' 在现实生活中还有其他值而不是 3。这恰好是我此时的测试数据。

Mar*_*ell 6

听起来有些组没有任何满足Where条件的项目。在Average不可为空值的空序列是不为零-这是一个例外。例如,有没有物品可Field16具有Field3大于零。

我注意到在你的“我想要的”表中你只有Field1as的值3- 如果这代表你的真实场景,也许过滤第二个表。

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

let AverageField3 = dg.Where(g => g.Field3 > 0.0).Average(g => (int?)g.Field3)
Run Code Online (Sandbox Code Playgroud)

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

let AverageField3 = dg.Where(g => g.Field3 > 0.0)
                      .Average(g => (int?)g.Field3)
                      .GetValueOrDefault();
Run Code Online (Sandbox Code Playgroud)

(替换int?float?decimal?或不管它是你的数据相匹配)