开发者

Data Transfer Object (DTO) to DisplayObject (DO) - How to flatten DTO's into a DO collection property

开发者 https://www.devze.com 2023-01-20 04:15 出处:网络
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:

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.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号