2012-06-04 3 views
0

Я следующую таблицу структуру: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 

Но в результате I ge t следующая строка: 1; 1; 1; 4.0; 60000

Группа. Усекает колонку «Цена», что не так?

ответ

0

Непонятно, какая перегрузка будет выбрана, если она не знает тип во время компиляции. Вы можете попробовать:

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

Если это не помогает, вероятно, вы должны дважды проверить, что значения действительно не усеченный до того вы получите запрос LINQ, например, при заполнении таблицы данных.

+0

Спасибо, это решить мою проблему. – user1434532

0

Ваш запрос скорее нечитаемым, посмотрите на мои изменения (например, используя сильный тип 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