Używam rodzajowe repozytorium która eksponuje IQueryable<T>
takiego:Jak zawinąć Fetch Linq2NHibernate i .ThenFetch wewnątrz mojego abstrakcyjnego repozytorium?
public IQueryable<T> AllEntities
{
get
{
return session.Query<T>();
}
}
mogę zapytać tak:
var results =
(from e in repository.AllEntities
where e.SomeProperty == "some value"
select e).ToList();
Jednak jeśli T
ma rodzica i dziadka podmiot i chcę załadować je chętnie, muszę to zrobić:
var results =
(from e in repository.AllEntities
where e.SomeProperty == "some value"
select e)
.Fetch(x => x.Parent)
.ThenFetch(x => x.Grandparent)
.ToList();
to działa, ale .Fetch
i .ThenFetch
są zarówno Linq2Nhibernate specyficzne metody przedłużania, który powoduje dwa problemy:
muszę zawierać
using NHibernate.Linq;
oświadczenie w górnej części mojego pliku. Jednak w momencie, w którym robię to zapytanie, powinno być ono agnostyczne.Przy próbie badanej jednostki to sposoby
.Fetch
i.ThenFetch
fail gdy wykonywane przedIQueryable<T>
że moja mock repozytorium zapewnia.
Jak mogę owinąć te wnętrze mojego interfejsu IRepository<T>
lub wewnątrz pewnych ogólnych metod rozszerzenie?
Aktualizacja:
Jak dotąd wszystko mam wymyślić jest dodać to do mojego repozytorium interfejsu:
IQueryable<T> EagerLoadParent<U>(IQueryable<T> query,
Expression<Func<T, U>> parentExpression);
IQueryable<T> EagerLoadParent<U, V>(IQueryable<T> query,
Expression<Func<T, U>> parentExpression,
Expression<Func<U, V>> grandparentExpression);
... i to do mojego wdrożenia repozytorium NHibernate:
public IQueryable<T> EagerLoadParent<U>(IQueryable<T> query,
Expression<Func<T, U>> parentExpression)
{
return query
.Fetch(parentExpression);
}
public IQueryable<T> EagerLoadParent<U, V>(IQueryable<T> query,
Expression<Func<T, U>> parentExpression,
Expression<Func<U, V>> grandparentExpression)
{
return query
.Fetch(parentExpression)
.ThenFetch(grandparentExpression);
}
Konsument tego interfejsu API wykonuje teraz:
var query =
(from e in repository.AllEntities
where e.SomeProperty == "some value"
select e);
var results = repository
.EagerLoadParent(query, e => e.Parent, p => p.Grandparent)
.ToList();
Ale brakuje w nim ładnej metody składni rozszerzeń, którą wolałbym. Szukam czegoś bliższego składni .Fetch
i .ThenFetch
.
To jest naprawdę dobry, ale teraz trzeba wdrożyć IFetchRequest który współpracuje z LINQ do obiektów? – Sly
W końcu znalazłem rozwiązanie tego problemu. Dzięki! – Chris
@ Chris - Czy mógłbyś podzielić się znalezionym rozwiązaniem? – Sam