Огромное преимущество для этого другого класса, который вы создаете, состоит в том, что, по вашему примеру, он не обязательно соответствует ни продукту, ни производителю.Подумайте об этом так:
Ваши классы Linq to SQL предназначены для общения в области «данных».
Ваши «данные»классы (те, с которыми у вас проблемы) предназначены для общения в домене «application».
Давайте рассмотрим пример.Предположим, в вашем приложении MVC вы хотели показать сетку информации о продуктах.Вы хотите увидеть их имя, цену (из таблицы продуктов) и страну их изготовления и название производителя (из таблицы производителей).Как бы вы назвали этот класс?Product_Manufacturer?Что если позже вы захотите добавить свойства из третьей таблицы, например, скидки на товары?Вместо того, чтобы думать об этих объектах в чисто области данных , подумайте о них в отношении вашего приложения .
Итак, вместо Product_Manufacturer, как насчет того, чтобы называть его ProductSummaryItem?Каждое свойство класса ProductSummaryItem будет отображаться 1: 1 с полем, отображаемым в вашей сетке в пользовательском интерфейсе.Ваш контроллер будет выполнять сопоставление информации в домене данных (Product, Manufacturer) с пользовательским классом, который вы создали в домене приложения (ProductSummaryItem).
Делая это, вы получаете удивительные преимущества:
1) Написание ваших взглядов становится действительно очень простым.Все, что вам нужно сделать, чтобы отобразить ваши данные - это циклически перебрать ProductSummaryItems и обернуть их в теги, и все готово.Это также позволяет для простой агрегации.Например, вы хотели добавить поле с именем ProductsSoldLastYear в ваш класс ProductSummaryItem.Вы можете сделать это очень просто в своих взглядах, потому что все это для них - другое свойство.
2) Поскольку представление является тривиальным и в контроллере присутствует логика отображения, становится намного проще проверить выход контроллера, поскольку он настроен на то, что будет видеть представление.
3) Поскольку класс ProductSummaryItem содержит только те данные, которые ему необходимы, ваши запросы могут потенциально стать намного быстрее, поскольку им нужно только запрашивать поля, которые будут заполнять ваш объект ProductSummaryItem, и ничего больше.Эти издержки могут стать чрезмерными, чем больше объектов предметной области составляют ваш объект ProductSummaryItem.
Этот шаблон называется Model View ViewModel (MVVM) и пользуется огромной популярностью как в MVC, так и в таких средах, как WPF.
Аргумент против MVVM заключается в том, что вам нужно несколько переопределить простые классы для операций CRUD.Полагаю, достаточно справедливо, но вы можете использовать такой инструмент, как automapper , чтобы помочь с такими вещами.Тем не менее, я думаю, вы довольно быстро обнаружите, что использование шаблона MVVM даже для CRUD приносит дивиденды, потому что, прежде чем вы это узнаете, даже с простыми классами, вы начнете хотеть иметь дополнительные поля, которые могут легко управлять вашими представлениями.