2012-07-24 3 views
2

У меня есть агрегированный просмотр данных в проекте MVC, который отображает итоговые суммы в месяц, разбитые по статусу аудита. Код контроллера устанавливает это вверх, используя простую проекцию LINQ в анонимный объект, как это:Если проекция LINQ будет строго типизирована

From audits In db.Audits 
Group By key = audits.DateCreated.Value.Month Into g = Group 
Select New With { 
    .Month = key, 
    .Assigned = g.Sum(AuditsWithStatus(AuditStatus.Issued)), 
    .Unassigned = g.Sum(AuditsWithStatus(AuditStatus.Pending)), 
    .Closed = g.Sum(AuditsWithStatus(AuditStatus.Closed)), 
    .Cancelled = g.Sum(AuditsWithStatus(AuditStatus.Cancelled)) 
} 

Я знаю, что это один из самых больших преимуществ LINQ (с помощью анонимных типов), но я не люблю проигранное сильная типизация в представлении (т. е. @ModelType SomeStrongType). Есть ли общие рекомендации по этому поводу? Статьи, блоги или другие места, которые касаются проблемы и когда ее использовать?

+0

анонимные типы создаются во время компиляции. они по-прежнему строго типизированы с точки зрения времени выполнения - у них просто есть сгенерированные компилятором имена. –

ответ

3

Вы не можете ничего сделать с анонимными типами вне сферы вашего метода. Например, вы не можете вернуть их на свой взгляд. В этих случаях вы должны использовать известный тип.

Я использую анонимные типы, когда я выбираю данные, которые затем обрабатываю по-другому. Например, выбирая некоторые сделанные на заказ данные из 1 источника с помощью Linq и помещая их в другой источник.

Если вы возвращаете агрегированные данные, такие как IEnumerable<IGrouping<TKey, TValue>> и TKey и TValue являются анонимными типами (вы можете группировать по анонимным типам, если хотите); то вы не захотите создать 2 класса для TKey и TValue, где TKey имеет переопределенные Equals и GetHashCode, чтобы вы могли сгруппироваться по нему. И затем сделайте не более, чем прочитайте некоторые ценности из него и выбросьте его, чтобы никогда не использовать их повторно.

TLDR; используйте их, когда нет необходимости создавать известный тип для хранения результатов. Если вам нужно передать свои результаты куда-то вне области действия метода, вам понадобится тип.

0

Общие рекомендации просты: всегда создавайте специальный тип viewmodel для просмотра. В вашем случае это будет довольно просто, содержащий именно те свойства, которые у вас есть в вашем анонимном классе.

Я понимаю, что это кажется ненужным накладным расходами, но это сделает ваш код более читабельным и поддающимся проверке.

 Смежные вопросы

  • Нет связанных вопросов^_^