2013-06-17 1 views
0

IQueryable을 반환하는 쿼리 메서드가있는 일반 리포지토리가 있습니다. 내 전화 코드에서 다음과 같은 것을 할 수있다.Nhibernate 가져 오기에 대한 Fluent 래퍼 ThenFetch

_repository.Query<MyClass>(x=>x.EntityId == 1).Fetch(x=>x.MyClassChild).ToList() 

그러나 나는 (내가 아는 한) 호출 코드를 테스트 할 수 없다. 그래서 나는 다음과 같은

public class Repository : IRepository 
{ 
.... 
    public FetchedResult<TQueried, TRelated> ThenFetch<TQueried, TFetch, TRelated>(INhFetchRequest<TQueried, TFetch> query, Expression<Func<TFetch, TRelated>> relatedObjectSelector) 
    { 
     INhFetchRequest<TQueried, TRelated> nhFetchRequest = query.ThenFetch(relatedObjectSelector); 
     return new FetchedResult<TQueried, TRelated>(this, nhFetchRequest); 
    } 

    public FetchedResult<TOriginating, TRelated> Fetch<TOriginating, TRelated>(IQueryable<TOriginating> query, Expression<Func<TOriginating, TRelated>> relatedObjectSelector) 
    { 
     INhFetchRequest<TOriginating, TRelated> nhFetchRequest = query.Fetch(relatedObjectSelector); 
     return new FetchedResult<TOriginating, TRelated>(this, nhFetchRequest); 
    } 
} 

할 노력하고있어 - 작품을 가져 오기 위해

public class FetchedResult<TQueried, TRelated> 
{ 
    private readonly IRepository _repository; 
    private readonly INhFetchRequest<TQueried, TRelated> _query; 

    public FetchedResult(IRepository repository, INhFetchRequest<TQueried, TRelated> query) 
    { 
     _repository = repository; 
     _query = query; 
    } 

    public FetchedResult<TQueried, TRelated> ThenFetch<TFetch>(Expression<Func<TFetch,TRelated>> relatedObjectSelector) 
    { 
     return _repository.ThenFetch(_query, relatedObjectSelector); 
    } 
} 

그래서 첫 번째 통화를하지만 repositor.ThenFetch에 대한 호출은 INhFetchRequest 쿼리를 취했지만 INhFetchRequest를 반환합니다. 그래서 FetchedResult를 사용하여 ThenFetch를 두 번째 호출 할 수는 없습니다.

이것이 문제라고 생각합니다. 이 시점에서 내 두뇌는 꽤 풀립니다. 누구든지 내가 알게 도와 줄 수 있다면 더 많은 정보를 제공 할 수 있습니다.

이제 통계를 사용하여이를 수행 할 수 있다는 것을 알았지 만 여기에서의 목표는 가져 오기 호출을 모의 할 수있게하는 것입니다.

감사합니다,

Raif

답변

0

Alrighty, 내 미약 한 뇌가 마지막으로 솔루션을 파악하고있다. 지옥 통근으로 지루한 후에 문제는 제네릭이 메소드 레벨이 아닌 객체 레벨에 있다는 것을 깨달았습니다. 다음은 내 솔루션입니다. 나는이 경우 나중에 내가

_repository.QueryFetch<InternetProfile>(x => x.CompanyId == Id).FetchMany<InternetProfile, SiteProperty>(x => x.SiteProperties).ToList<InternetProfile>(); 

일반 선언 조금 자세한 것을 내가 찾을 수 있습니까를 다음과 같이

public class Repository : IRepository 
{ 
.... 
    public FetchQuery QueryFetch<ENTITY>(Expression<Func<ENTITY, bool>> where = null) where ENTITY : Entity 
    { 
     var query = _unitOfWork.CurrentSession.Query<ENTITY>(); 
     var queryable = where == null ? query : query.Where(where); 
     return new FetchQuery(this, queryable); 
    } 

    public FetchedResult ThenFetch<TQueried, TFetch, TRelated>(INhFetchRequest<TQueried, TFetch> query, Expression<Func<TFetch, TRelated>> relatedObjectSelector) 
    { 
     INhFetchRequest<TQueried, TRelated> nhFetchRequest = query.ThenFetch(relatedObjectSelector); 
     return new FetchedResult(this, nhFetchRequest); 
    } 

    public FetchedResult ThenFetchMany<TQueried, TFetch, TRelated>(INhFetchRequest<TQueried, TFetch> query, Expression<Func<TFetch, IEnumerable<TRelated>>> relatedObjectSelector) 
    { 
     INhFetchRequest<TQueried, IEnumerable<TRelated>> nhFetchRequest = query.ThenFetch(relatedObjectSelector); 
     return new FetchedResult(this, nhFetchRequest); 
    } 

    public FetchedResult Fetch<TOriginating, TRelated>(IQueryable<TOriginating> query, Expression<Func<TOriginating, TRelated>> relatedObjectSelector) 
    { 
     INhFetchRequest<TOriginating, TRelated> nhFetchRequest = query.Fetch(relatedObjectSelector); 
     return new FetchedResult(this, nhFetchRequest); 
    } 

    public FetchedResult FetchMany<TOriginating, TRelated>(IQueryable<TOriginating> query, Expression<Func<TOriginating, IEnumerable<TRelated>>> relatedObjectSelector) 
    { 
     INhFetchRequest<TOriginating, TRelated> nhFetchRequest = query.FetchMany(relatedObjectSelector); 
     return new FetchedResult(this, nhFetchRequest); 
    } 
} 

public class FetchedResult 
{ 
    private readonly IRepository _repository; 
    private object _query; 
    public FetchedResult(IRepository repository, object query) 
    { 
     _repository = repository; 
     _query = query; 
    } 

    public FetchedResult ThenFetch<TQueried, TFetch, TRelated>(Expression<Func<TFetch, TRelated>> relatedObjectSelector) 
    { 
     return _repository.ThenFetch((INhFetchRequest<TQueried, TFetch>)_query, relatedObjectSelector); 
    } 

    public FetchedResult ThenFetchMany<TQueried, TFetch, TRelated>(Expression<Func<TFetch, IEnumerable<TRelated>>> relatedObjectSelector) 
    { 
     return _repository.ThenFetchMany((INhFetchRequest<TQueried, TFetch>)_query, relatedObjectSelector); 
    } 

    public List<TOriginating> ToList<TOriginating>() 
    { 
     return ((IQueryable<TOriginating>)_query).ToList(); 
    } 
} 

public class FetchQuery 
{ 
    private readonly IRepository _repository; 
    private readonly object _query; 

    public FetchQuery(IRepository repository, object query) 
    { 
     _repository = repository; 
     _query = query; 
    } 

    public FetchedResult Fetch<TOriginating, TRelated>(Expression<Func<TOriginating, TRelated>> relatedObjectSelector) 
    { 
     return _repository.Fetch((IQueryable<TOriginating>)_query, relatedObjectSelector); 
    } 

    public FetchedResult FetchMany<TOriginating, TRelated>(Expression<Func<TOriginating, IEnumerable<TRelated>>> relatedObjectSelector) 
    { 
     return _repository.FetchMany((IQueryable<TOriginating>)_query, relatedObjectSelector); 
    } 

    public List<TOriginating> ToList<TOriginating>() 
    { 
     return ((IQueryable<TOriginating>) _query).ToList(); 
    } 
} 

사용이 될 링크를 포함 할 것이라고 말했다 문제를에 블로그 수 있지만, 그것은 나치 작품 지금은 그걸두고 갈거야. 물론 모든 제안을 환영 할 것입니다.

Raif