Простой способ возвратить анонимные типы (для создания MVC, использующего LINQ возможный)

Я хотел бы реализовать MVC при использовании LINQ (а именно, LINQ к объектам). Путем я сделал бы, это, имеют Контроллер, генерируют (или назовите что-то, что генерирует), набор результатов с помощью 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 или безопасные с точки зрения типов анонимные возвращаемые значения (это кажется мне, компилятор должен, конечно, быть способен к этому), это, кажется, почти невозможно чисто разделить Контроллер от Представления.

5
задан tereško 17 November 2013 в 17:31
поделиться

4 ответа

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

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

  • Проверка типов во время компиляции
  • Производительность
  • Intellisense

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

1
ответ дан 13 December 2019 в 22:06
поделиться

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

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

3
ответ дан 13 December 2019 в 22:06
поделиться

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

4
ответ дан 13 December 2019 в 22:06
поделиться

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

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

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

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

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

Есть ли в этом смысл для вас?

2
ответ дан 13 December 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: