LinQ Group.Average обрезает мои значения
У меня есть следующая структура таблицы:
tempDt
col1 = Product (Integer)
col2 = Customer (Integer)
col3 = Center (Integer)
col4 = Date (Date)
col5 = Price (Double)
col6 = Sales (Double)
Этот пример строки:
1;1;1;01.01.2012;4.39;20000
1;1;1;02.02.2012;4.46;15000
1;1;1;03.03.2012;4.22;25000
И следующий запрос Linq:
For Each item In From u In tempDT.AsEnumerable
Group u By Product = u("Product"), Customer = u("Customer"), Center = u("Center") Into Group
Select Product, Customer, Center, Price = Group.Average(Function(g) g("Price")), Sales = Math.Round(Group.Sum(Function(g) CDbl(g("Sales"))), 2)
tmpDt.Rows.Add(item.Product, item.Customer, item.Center, item.Price, item.Sales)
Next
Но в результате я получаю следующую строку: 1; 1; 1; 4.0; 60000
Group.Average обрезает столбец "Цена", что не так?
2 ответа
Решение
Мне не ясно, какую перегрузку выберет, учитывая, что он не знает тип во время компиляции. Вы можете попробовать:
Group.Average(Function(g) g.Field(Of Double)("Price"))
Если это не помогает, вам, вероятно, следует дважды проверить, что значения действительно не усекаются, прежде чем вы перейдете к запросу LINQ, например, при заполнении таблицы данных.
Ваш запрос не читается, посмотрите на мои изменения (например, используйте строгий тип DataRow.Field
метод расширения):
Dim groups = From u In tempDT.AsEnumerable
Group u By Key = New With {
.Product = u.Field(Of Integer)("Product"),
.Customer = u.Field(Of Integer)("Customer"),
.Center = u.Field(Of Integer)("Center")
} Into PCCroup = Group
Select New With {
.PCC = Key,
.Price = PCCroup.Average(Function(u) u.Field(Of Double)("Price")),
.Sales = Math.Round(PCCroup.Average(Function(u) u.Field(Of Double)("Sales")), 2)
}
For Each item In groups
tmpDt.Rows.Add(item.PCC.Product, item.PCC.Customer, item.PCC.Center, item.Price, item.Sales)
Next