Создать IEnumerable <> несвязанных сущностей EF4? - PullRequest
0 голосов
/ 10 мая 2011

Итак, вот сценарий ... Мой сайт отображает три различных типа продуктов для продажи. Для этого примера мы назовем их Мебель, Одежда и Игрушки. Три продукта явно различаются, но все они имеют одни и те же свойства (цена, дата создания, описание, краткое описание и т. Д.).

Я использую EF4, поэтому, когда я отображаю список продуктов на странице «Мебель», я могу просто сделать что-то вроде этого:

IEnumerable<Furniture> furniture = Repository.GetFurniture();

Все работает отлично, когда на странице отображается только один тип продукта. У меня есть весь набор мебели, отображаемый в постраничном списке из 10 продуктов на странице, сортируемый по имени, цене, дате объявления и т. Д.

Однако я хочу создать ссылку на "Просмотреть все товары этого продавца". Эта страница должна отображать ВСЕ, что продавец перечислил, независимо от того, мебель это, одежда или игрушки. Хитрость в том, что он также должен быть отсортирован по полям, которые разделяют все продукты (цена, название, дата объявления и т. Д.)

Так что я хотел бы сделать что-то вроде этого псевдокода:

IEnumerable<IProduct> products = 
Repository.GetAllProducts(sellerId).OrderBy(sortField).Skip(skip).Take(take);

Затем в представлении (да, я ссылаюсь на сущности EF4 в представлении):

@foreach (var product in Model.products.OrderBy(sortField))
{
    if (product is Furniture)
    {
       Html.RenderPartial("FurnitureResult", (Furniture)product)
    }
    else if (product is Clothes)
    {
       Html.RenderPartial("ClothesResult", (Clothes)product)
    }
    // repeat for toys
}

Итак, мой вопрос:

Как будет выглядеть вызов Repository.GetAllProducts (sellerId)? Это должен быть набор запросов LINQ, который получает всю мебель, одежду и игрушки и объединяет их в один IEnumerable <>. Если это невозможно, какие еще методы я могу использовать, чтобы получить список таких продуктов?

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

Спасибо!

Ответы [ 3 ]

2 голосов
/ 10 мая 2011

Попробуйте создать частичные классы для каждой из сущностей.Частичный класс будет реализовывать интерфейс IProduct, который не будет частью EF, но будет иметь свойства для возврата цены, имени, даты объявления и т. Д.

Реализация этих методов получения свойств для возврата определенных свойств объектаи реализуйте метод GetAllProducts, чтобы вернуть объединенное перечисление всех типов сущностей.

0 голосов
/ 10 мая 2011

Альтернативные варианты:

Объединение всех товаров в коллекции типа Object, поэтому Repository.GetFurniture (). Cast (). Union (Repository.GetClothes (). Cast ());

Или: используйте динамические и ducktyping и рендеринг с использованием общих имен свойств.(BLEG)

0 голосов
/ 10 мая 2011

Рассматривали ли вы создание представления базы данных и добавление его в свой контекст. В противном случае

Repository.GetAllProducts(sellerId).OrderBy(sortField).Skip(skip).Take(take);

будет работать в памяти, я имею в виду, что вам нужно будет по крайней мере выполнить его на 3 разных DbSets и объединить их для получения окончательного набора.

Другим вариантом является использование Наследования, создание базового типа Продукта и наследование от него 3 различных продуктов. http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph.aspx Ознакомьтесь со всеми вариантами наследования в приведенном выше веб-блоге, чтобы в нем было еще 2 блога.

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