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 cl开发者_StackOverflowass 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.
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.
精彩评论