Отображение из реляционной базы данных - PullRequest
1 голос
/ 29 августа 2011

В отношениях один к одному все просто.
Когда возникают проблемы один ко многим или ко многим ...
Сейчас я не использую инструмент ORM по многим причинам, и мне интересно, когдая хочу получить данные, лучше ли заново собрать отношения один ко многим, используя несколько запросов или в коде ..

Например .. Имея класс Category и класс Product ...

В таблице товаров есть столбец для идентификатора категории (одна категория для многих товаров).

Поэтому для моего полного каталога лучше выполнить 2 запроса, чтобы получить нужные мне категории и товары, а затем заполнить для каждой категории свои товары.Список?(Это очень просто с LINQ) ..

Или я должен вызвать запрос для каждой категории?Как select id from products where category_id=5;

Также я не знаю, как назвать функции, например, установить, хочу ли я получить другую сторону отношения или нет ..

Ответы [ 2 ]

2 голосов
/ 29 августа 2011

Вы всегда должны использовать наименьшее количество запросов для получения ваших данных. Выполнение одного запроса на категорию для загрузки продуктов называется проблемой N + 1 и может быстро вызвать узкое место в вашем коде.

Что касается имен ваших методов, которые определяют ваши планы выборки, присвойте им имена в соответствии с тем, что фактически делает метод, например IncludeProducts или WithProducts.

1 голос
/ 29 августа 2011

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

Чтобы использовать только один запрос, выберите внутреннее объединение для двух таблиц

SELECT c.*, p.* 
FROM Category c INNER JOIN Product p ON c.CategoryId = p.CategoryId

, а затем создайте бизнес-объекты из полученного набора данных

result.GroupBy(r => r.CategoryId).Select(group =>
    new Category(/* new Category using c.* columns */)
    { 
        Products = /* new list of Products from p.* values */
    });

Но я должен спросить - почему вы не используете ORM?

...