Data Transfer Object (DTO) в DisplayObject (DO) - Как объединить DTO в свойство коллекции DO - PullRequest
1 голос
/ 18 октября 2010

Я бы хотел объединить коллекцию DTO в один DO, используя LINQ, но мой 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
}

У меня тогда есть ДО, которое выглядит так:

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

DataValue - это объект значения, который выглядит следующим образом:

public class DataValue {
    MonthPeriod Month
    double Data
}

Я могу получить список DTO просто отлично, используя NHibernate, но у меня возникают проблемы с включением их в мою DO. Я хотел бы использовать LINQ для создания DO. Что мне нужно сделать, чтобы получить набор DO, связанных с Product и Location, со списком объектов DataValue, содержащих данные по месяцам?

Другими словами ...

Вот пример набора исходных данных:

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 Ответ

2 голосов
/ 18 октября 2010
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 могут быть ссылочными типами, следите за равенством ссылок.

...