문제

DDD 과대 광고에서 영감을 얻은 저는 데이터베이스가 전혀없는 척하는 수업을 디자인했습니다. 그런 다음 nhibernate를 사용하여 클래스를 데이터베이스 테이블에 매핑했습니다. 내 클래스 그래프의 일부는 다음과 같습니다. order (hasmany)-> product (setto)-> 판매자. 특정 판매자에 대한 모든 주문을 검색합니다. 코드가 있습니다.

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();

    }
}

예쁘지는 않지만 내 단위 테스트와 함께 작동했습니다. 실제 데이터를 데이터베이스에 주입하기 시작할 때까지 기뻤습니다. 공연이 너무 나빠서 구토하고 싶은 것입니다. 그래서 저장소 코드에 대해 약간의 조사를했습니다. 놀랍게도, 내가 원하는 주문을 찾기 위해서는 주문 테이블에서 모든 데이터와 제품 테이블의 모든 데이터와 판매자 테이블의 일부 데이터를 가져와야했습니다.

그래서 여기 내 문제가 온다. 데이터베이스 영역의 총 더미로서, 나는 그것이 심하게 악취가 나지 않더라도 저장소 코드를 개선하는 방법을 모르겠습니다. 따라서 주문 클래스를 수정하여 판매자 클래스에 대한 참조를 갖도록 유혹을 받고 HQL을 사용하여 성능을 향상시키기 위해 WHEDE 절을 추가 할 수 있습니다. 그러나 데이터베이스 문제로 인한 클래스 구조를 수정하면 DDD 원칙을 위반하는 것으로 보입니다.

특히 저장소 코드를 개선 할 때 귀하의 제안은 무엇입니까? ActiveRecord 및 HQL을 위해 LINQ를 시도했습니다. 그러나 그들이 일하게 할 수 없었습니다.

도움이 되었습니까?

해결책 2

많은 연구 후에 나는이 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의 답변에서 아이디어를 얻었습니다. 이것이 성능을 부팅하는지 알려주세요.

다른 팁

Afaik Activerecord는 LINQ를 직접 지원하지 않지만 LINQ를 사용하여 제공자를 제공 할 수 있습니다. 여기 샘플입니다. 결국 더 전통적이고 성숙한 기준 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에서 작동하는 것은 아니기 때문입니다)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top