受DDD炒作的启发,我设计了我的课程,假装没有数据库。然后使用NHibernate将这些类映射到数据库表。部分类图形如下所示:Order(hasmany) - > Product(belongssto) - > Seller。检索为某个卖家下的所有订单。我有代码:Nhibernate和Activerecord的数据库性能
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表中获取所有数据,并从Product表中获取所有数据,并从Seller表中获取一些数据。
所以,我的问题来了。作为数据库领域的一个虚拟角色,我不知道如何改进我的存储库代码,即使我知道它很糟糕。所以,我很想修改我的Order类以引用Seller类,以便我可以使用hql来添加Where子句来提高性能。但是由于数据库问题而修改类结构似乎违反了DDD原则。
您的建议是什么,特别是在改进我的存储库代码?我曾尝试Linq的ActiveRecord和hql。但无法让他们工作。
ActiveRecord确实支持Linq。我从它的源代码中发现了它:)。但我无法在ActiveRecord的测试中找到像我一样复杂的代码:( – 2009-11-18 09:43:39
的确如此,我已更正了我的文章,对于desinformation的对不起。 – 2009-11-18 10:09:31
谢谢。我的代码片段完全一样(从ActiveRecordLinqBase继承)但是我得到了一个异常,我怀疑是发生在Items.First()上,因为First是一个扩展方法,ActiveRecord Linq没有库来理解它。 – 2009-11-18 10:59:04