Вдохновленный рекламой DDD, я разработал свои классы, притворяясь, что базы данных вообще не было. А затем использовал NHibernate для сопоставления классов с таблицами базы данных. Часть моего графа классов выглядит следующим образом: Order (hasmany) -> Product (ownsto) -> Продавец. Чтобы получить все заказы, размещенные для определенного продавца. У меня есть код:
public class Order:ActiveRecordBase<Order>
{
[HasMany]
public ICollection<Product> Items{get;set;}
...
}
public class Product: Order:ActiveRecordBase<Product>
{
[BelongsTo]
public Seller Seller{get; set;}
...
}
public class OrderRepository:IOrderRepository
{
public IQuerable<Order> GetOrdersBySellerId(int sellerId)
{
return Order.FindAll().AsQuerable.Where(x=>x.Items.Count > 0 &&
x.Items.First().Seller.SellerID == sellerId).AsQuerable();
}
}
Не очень, но это сработало с моими юнит-тестами. Я был счастлив, пока мы не начали вводить реальные данные в базу данных. Производительность настолько плохая, что хочется рвать. Итак, я провел небольшое исследование для своего кода репозитория. Неудивительно, что для того, чтобы найти нужные мне заказы, мне пришлось получить все данные из таблицы заказов, а также все данные из таблицы продуктов и некоторые данные из таблицы продавцов.
Итак, вот моя проблема. Как абсолютный дурак в области базы данных, я не знаю, как улучшить свой код репозитория, хотя знаю, что он плохо воняет. Поэтому у меня возникает соблазн изменить свой класс Order, чтобы иметь ссылку на класс Seller, чтобы я мог использовать hql для добавления предложения Where для повышения производительности. Но изменение структуры классов из-за проблем с базой данных, похоже, нарушает принципы DDD.
Что вы предлагаете, особенно в улучшении моего кода репозитория? Я пробовал Linq для ActiveRecord и hql. Но не мог заставить их работать.