数据传输对象(DTO)到DisplayObject(DO) - 如何将DTO压缩为DO集合属性

时间:2010-10-18 02:26:19

标签: c# linq mapping dto displayobject

我想使用LINQ将DTO的集合压缩成单个DO,但我的LINQ-fu很弱。

我的DTO看起来像这样:

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

并使用此架构映射到SQL数据库表:

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

Product,Location和Month都继承自LookupEntity,如下所示:

public class LookupEntity {
    string Name,
    int Id
}

然后我有一个看起来像这样的DO:

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

DataValue是一个如下所示的值对象:

public class DataValue {
    MonthPeriod Month
    double Data
}

我可以使用NHibernate获得DTO的列表,但是我有问题将它们展平到我的DO中。我想用LINQ来创建DO。如何通过按月包含数据的DataValue对象列表来获取产品和位置键入的DO集合,我需要做什么?

换句话说......

以下是源数据集示例:

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

我可以把它映射到DTO就好了。我现在想用LINQ来获取2个DO实例,每个实例都有一个包含3个DataValue实例的列表。

1 个答案:

答案 0 :(得分:2)

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()
};

由于Product,Location和Month可能是引用类型 - 请注意引用相等。