I've the following table structure:

tempDt

col1 = Product (Integer)  
col2 = Customer (Integer)  
col3 = Center (Integer)  
col4 = Date (Date)  
col5 = Price (Double)  
col6 = Sales (Double)  

This example rows:

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  

And the following Linq Query:

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

But as result I get the following line: 1;1;1;4.0;60000

Group.Average truncates the "Price" column, what's wrong?

有帮助吗?

解决方案

It's not clear to me which overload that will pick given that it doesn't know the type at compile-time. You could try:

Group.Average(Function(g) g.Field(Of Double)("Price"))

If that doesn't help, you should probably double check that the values really aren't truncated before you get to the LINQ query, e.g. while filling the data table.

其他提示

Your query is rather unreadable, have a look at my changes(e.g. using the strong type DataRow.Field extension method):

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top