linq2sql, шаблон репозитория - как запросить данные из двух или более таблиц? - PullRequest
1 голос
/ 30 ноября 2010

Я использую шаблон репозитория (и linq2sql в качестве доступа к данным) и имею, например, ProductsRep и CustomersRep.

В очень простом сценарии db имеет две таблицы - Produsts (ProductID, CustomerID, ProductName, Date) и Customer (CustomerID, FirstName, LastName).

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

Но если я хочу опросить всех клиентов, которые покупают конкретный продукт по названию продукта, я должен получить ProductID этого продукта с помощью ProductsRep, а затем получить всех клиентов, которые покупают продукт с этим идентификатором, с помощью CustomersRep.

Я прав?На самом деле это два sql-запроса, которые должны генерировать l2s, возможно ли сделать только один запрос?

И, вообще, если мы хотим запрашивать данные, используя несколько таблиц со связями и шаблоном хранилища, как это сделать, сократив количество запросов до минимума?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 01 декабря 2010

Подумайте о заявлении, которое вы сделали:

Но если я хочу опросить всех клиентов, которые покупают конкретный продукт по названию продукта, я должен получить ProductID этого продукта с помощью ProductsRep, а затем получить всех клиентовкоторые покупают продукт с этим идентификатором, используя CustomersRep.

Это пахнет неприятностями. Создайте репозиторий для облегчения поведения в изолированной области вашего домена, а не для каждой бизнес-единицы.

Распространенная ошибка DDD / Repository - думать о данных.DONT.Подумайте о поведении.

У вас есть объект Products , который относится к клиенту .Это означает, что Продукт не может существовать без клиента.Правильно?Следовательно, Клиент является вашим совокупным корнем - он контролирует поведение этой части модели вашего домена.

Ваш комментарий к ответу выше подтверждает, что вы работаете в нескольких репозиториях.У вас есть два варианта: 1) единица работы, 2) исправить дизайн хранилища.

Вам нужен только 1 репозиторий - назовем его CustomerProductRepository .

Затемвыполните вышеуказанный запрос:

var customersWhoBuyHats = customerProductRepository
                             .Products
                             .Include("Customer")
                             .Where(x => x.ProductName == "Hat")
                             .Select(x => x.Customer)
                             .ToList();

Результат - List<Customer>, и вы сделали это с помощью одного вызова базы данных.

HTH.

0 голосов
/ 30 ноября 2010
var customers = from cust in CustomersRep
                join prod in ProductsRep on prod.CustomerID equals cust.CustomerID
                where prod.ProductName == yourInput
                select cust;

Вы можете написать запрос, похожий на запрос в SQL (по сути).Выше yourInput - это переменная, которая содержит имя интересующего вас продукта.

Это должно дать вам один запрос к БД, если ProductsRep и CustomersRep находятся в одной БД.*

...