0

受 DDD 炒作的启发,我设计了我的课程,假装根本没有数据库。然后使用 NHibernate 将类映射到数据库表。我的部分类图如下所示:Order (hasmany)--> Product (belongsto)-->Seller。检索为某个卖家下的所有订单。我有代码:

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原则。

您有什么建议,尤其是在改进我的存储库代码方面?我已经为 ActiveRecord 和 hql 尝试过 Linq。但无法让他们工作。

4

2 回答 2

0

尽管 AFAIK ActiveRecord 不直接支持 LINQ,但您可以使用 LINQ to NHibernate 提供程序。是一个示例。最后有一个使用更传统和成熟的标准 API 的示例。

更新:对不起,我错了。似乎您需要从 继承您的实体,并使用其属性ActiveRecordLinqBase<T>构建查询。Queryable

它应该看起来像

public IQuerable<Order> GetOrdersBySellerId(int sellerId)
{
    return Order.Queryable
               .Where(x=>x.Items.Count > 0 && x.Items.First().Seller.SellerID == sellerId)();
}

如果你想坚持简单ActiveRecordBase<T>,你可以使用静态方法ActiveRecordLinq.AsQueryable<T>()

public IQuerable<Order> GetOrdersBySellerId(int sellerId)
{
    return ActiveRecordLinq.AsQueryable<Order>()
               .Where(x=>x.Items.Count > 0 && x.Items.First().Seller.SellerID == sellerId)();
}

您是否根据搜索条件尝试过?(我问这个,因为 AFAIK 你不是所有的 LINQ 结构都在 NHibernate 上工作)

于 2009-11-18T09:39:31.560 回答
0

经过大量研究,我得到了这个 hql 声明

public IQuerable<Order> GetOrdersBySellerId(int sellerId)
{
     string hql = @"select  o 
                    from     Order o, Product p
                    where    p.Seller.SellerID=:sellerID
                    and      p in elements(o.Items )";

     SimpleQuery<Order> q = new SimpleQuery<Order>(hql);
     q.SetParameter("sellerID", sellerID);
            return q.Execute().AsQueryable();
}

感谢这篇文章。我从 Ayende 的回复中得到了这个想法。请让我知道这是否会启动性能。

于 2009-11-18T12:44:55.283 回答