Я хотел бы реализовать 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 или безопасные с точки зрения типов анонимные возвращаемые значения (это кажется мне, компилятор должен, конечно, быть способен к этому), это, кажется, почти невозможно чисто разделить Контроллер от Представления.
Поскольку никто даже не пытался ответить на мой вопрос, я отвечу на него сам.
Оказывается, C # 4.0 поддерживает утиную типизацию - они называют это динамической типизацией . Однако, используя динамические типы для возврата анонимных типов, мы теряем преимущества сильных типов:
Я открыл запрос функции, чтобы строго - введите анонимные возвращаемые типы здесь - если вы думаете, что это будет полезным дополнением к C # 5, перейдите по ссылке и сообщите команде .Net!
Анонимные типы в первую очередь предназначены для использования внутри метода. Они не подходят для связи между методами.
Если вам нужно передать набор данных между двумя функциями, лучший способ - создать новый тип, обертывающий данные, или использовать группировку проигравших, например Tuple
или KeyValuePair
Использовать слой модели представления. Ваше представление должно знать, что оно будет отображать. Я предполагаю, что можно создать представление, которое просто форматирует многомерный массив данных, но это не совсем лучший повод для использования решения MVC. Однако вы можете заполнить модель представления анонимным объектом для использования в вашем представлении.
Как насчет этого?
Я предполагаю, что у вас есть класс сущности для вашей таблицы myTable (назовем его MyTableEntity), так почему разве вы не создаете экземпляр нового объекта MyTableEntity и не используете инициализатор объекта для заполнения только тех столбцов, которые вам нужны?
return (from o in myTable select new MyTableEntity { AColumn = o.column });
Это не будет преобразовано в SELECT *, как вы просили, но у вас все равно будет способ передать строго типизированный возражать против взгляда.
Вы должны быть осторожны, чтобы просто использовать инициализированные свойства внутри представления и все.
Есть ли в этом смысл для вас?