tags:

views:

33

answers:

1

I would like to flatten a collection of DTO's into a single DO using LINQ, but my LINQ-fu is weak.

My DTO looks like this:

public class DTO {
   Product product,
   Location location,
   MonthPeriod month,
   double Data
}

and maps to a SQL database table with this schema:

ProductID int,
LocationID int,
MonthPeriodID int,
Data numeric(18,6)

Product, Location and Month all inherit from LookupEntity which looks like this:

public class LookupEntity {
    string Name,
    int Id
}

I then have a DO that looks like this:

public class DO {
    Product product,
    Location location,
    IList<DataValue> values
}

DataValue is a value object that looks like this:

public class DataValue {
    MonthPeriod Month
    double Data
}

I can get a list of DTO's just fine using NHibernate, but I'm having problems flattening them into my DO. I would like to use LINQ to create the DO's. What do I need to do to get a collection of DOs keyed off of Product and Location with a list of DataValue objects containing the data by month?

In other words...

Here's a sample source data set:

Product:             Location:            Month:              Data:
ProductA             MI                   Jan                 10
ProductA             MI                   Feb                 20
ProductA             MI                   Mar                 30
ProductB             CA                   Jan                 100
ProductB             CA                   Feb                 200
ProductC             CA                   Mar                 300

I can get that mapped to a DTO just fine. I would now like to use LINQ to get 2 instances of DO, each of which has a list containing 3 instances of DataValue.

+1  A: 
from x in DTOs
group new DataValue() {MonthPeriod = x.Month, Data = x.Data}
  by new {Product = x.Product, Location = x.Location}
  into g
select new DO()
{
  product = g.Key.Product,
  location = g.Key.Location,
  value = g.ToList()
};

Since Product, Location and Month might be reference types - watch out for reference equality.

David B
Perfect. Thank you very much!
squillman