Простой способ вернуть анонимные типы (сделать возможным использование MVC с использованием LINQ) - PullRequest
5 голосов
/ 16 марта 2010

Я бы хотел реализовать MVC при использовании LINQ (в частности, LINQ-to-entity). Я бы сделал так, чтобы контроллер генерировал (или вызывал что-то, что генерирует) набор результатов с помощью LINQ, а затем возвращал его в представление для отображения данных. Проблема, если я сделаю:

return (from o in myTable select o);

Все столбцы считываются из базы данных, даже те (потенциально десятки), которые мне не нужны. И - что более важно - я не могу сделать что-то вроде этого:

return (from o in myTable select new { o.column });

потому что нет способа сделать анонимные типы безопасными для типов! Я точно знаю, что нет хорошего, чистого способа сделать это в 3.5 ( это не чисто ...), а как насчет 4.0? Есть ли что-то запланированное или даже предложенное? Без чего-то вроде duck-typing-for-LINQ или безопасных для типов анонимных возвращаемых значений (мне кажется, компилятор должен быть способен на это), кажется, что невозможно чисто отделить контроллер от вида.

Ответы [ 6 ]

4 голосов
/ 16 марта 2010

Использовать вид модели слоя. Ваше мнение должно знать, что оно будет отображать. Я предполагаю, что возможно создать представление, которое просто форматирует многомерный массив данных, но это не совсем лучшая причина для решения MVC. Однако вы можете заполнить модель представления анонимным объектом для использования в вашем представлении.

3 голосов
/ 16 марта 2010

Анонимные типы в первую очередь предназначены для использования в методе. Они не подходят для общения между методами.

Если вам нужно передать набор данных между двумя функциями, лучше всего создать новый тип, обертывающий данные, или использовать группировку неудачников, например Tuple<T1,T2> или KeyValuePair<TKey,TValue>

2 голосов
/ 27 апреля 2010

Как насчет этого?

Я предполагаю, что у вас есть класс сущностей для вашей таблицы 'myTable' (давайте назовем его 'MyTableEntity'), так почему бы вам не создать экземпляр нового объекта MyTableEntity и использовать инициализатор объекта для заполнения только тех столбцов, которые вам нужны? 1003 *

return (from o in myTable select new MyTableEntity { AColumn = o.column });

Это не будет переводиться в SELECT *, как вы просили, но у вас все равно будет возможность передать строго типизированный объект в представление.

Вы должны быть осторожны, чтобы просто использовать инициализированные свойства внутри представления и все.

Имеет ли это смысл для вас?

1 голос
/ 10 апреля 2010

Поскольку никто даже не пытался ответить на мой вопрос, я отвечу на него сам ...

Оказывается, C # 4.0 поддерживает типизацию с уткой - они называют это динамическая типизация . Однако при использовании динамических типов для возврата анонимных типов мы теряем преимущества сильных типов:

  • Проверка типов во время компиляции
  • Performance
  • Intellisense

Я открыл запрос функции, чтобы иметь строго типизированные анонимные типы возврата здесь - если вы считаете, что это будет полезным дополнением к C # 5, перейдите по ссылке и сообщите команде .Net!

0 голосов
/ 24 марта 2014

Вы можете легко преобразовать анонимные типы в динамические объекты, вот простая реализация Donymous объектов (динамических анонимных объектов), которые могут заполняться из Anonymous объекта или DataReader.

0 голосов
/ 15 апреля 2011

В .NET 4.0 анонимные типы могут быть легко преобразованы в ExpandoObjects, и, таким образом, все проблемы устраняются с помощью издержек самого преобразования. Проверьте здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...