.NET - ORM и все возможные комбинации - ViewModel? - PullRequest
4 голосов
/ 27 августа 2009

Как бы вы подошли к этой проблеме с ORM? Это гипотетический (упрощенный) пример:

У меня есть таблица городов:
1 - Нью-Йорк
2 - Лондон
3 - Сан-Франциско
4 - Новый Орлеан

У меня есть таблица результатов: (первый столбец Уникальный первичный ключ, код второго месяца, третий FK для города, четвертый счет (int))
1 - 352 - 1 - 9
2 - 352 - 2 - 10

За месяц 352 упоминаются только Нью-Йорк и Лондон.

Когда я представляю это пользователю в пользовательском интерфейсе, мне нужна сетка, показывающая все 4 города за этот месяц. И нули (пробелы) для городов Сан-Фран и Новый Орлеан.

Каков наилучший подход для этого с ORM? Вернуть ваши бизнес-объекты в форме модели, а затем преобразовать их в форму представления? Как вы справились с подобными ситуациями в ORM? Я уже справлялся с этим в ADO.NET с помощью своих операторов SQL, но никогда не делал подобных вещей в ORM, и я ищу совет, руководство или подход.

Ответы [ 2 ]

2 голосов
/ 28 августа 2009

На самом деле мы практикуем форму разделения командных запросов (версия Грега Янга - не версия Мейера), поэтому мы, по крайней мере, будем использовать NHibernate ICriteria, чтобы выбрать нужные детали, а затем использовать AliasToBeanTransformer, чтобы вставить их непосредственно в DTO.

Для наших самых сложных объектов у нас фактически есть отдельная таблица со всеми подробностями, которые экран должен отобразить, свернутыми в одну строку (или OLAP). Затем мы можем выполнить запросы непосредственно к этой таблице, что обойдёт затраты на загрузку сложного объекта, который содержит гораздо больше информации, чем нужно нашему экрану.

0 голосов
/ 27 августа 2009

Я использую LINQ для сопоставления объектов домена для просмотра моделей. (Я использую Entity Framework, но метод работает в любом ORM с хорошей поддержкой LINQ.) Сначала напишите модель представления POCO, затем спроецируйте на нее:

var pm = from c in Context.Cities
         let score = c.Scores.Where(s => s.MonthCode == selectedMonthCode).FirstOrDefault()
         select new CityScoresPresentation
         {
             City = c.Name,
             Score = score.Score
         };

Это LINQ to Entities. LINQ to SQL работает аналогично. YMMV с другими реализациями LINQ ORM.

Я настоятельно рекомендую использовать модель представления вместо привязки представлений к типам с поддержкой ORM.

...