estoy usando un repositorio genérico que expone un IQueryable<T>
así:¿Cómo envuelvo .Fetch y .ThenFetch de Linq2NHibernate dentro de mi repositorio abstracto?
public IQueryable<T> AllEntities
{
get
{
return session.Query<T>();
}
}
puedo consulta como esta:
var results =
(from e in repository.AllEntities
where e.SomeProperty == "some value"
select e).ToList();
Sin embargo, si una entidad tiene T
padre y abuelo y quiero cargarlos con entusiasmo, tengo que hacer esto:
var results =
(from e in repository.AllEntities
where e.SomeProperty == "some value"
select e)
.Fetch(x => x.Parent)
.ThenFetch(x => x.Grandparent)
.ToList();
esto funciona, pero .Fetch
y .ThenFetch
son los dos métodos de extensión específica Linq2Nhibernate, que están produciendo dos problemas:
tengo que incluir una declaración
using NHibernate.Linq;
en la parte superior de mi archivo. Sin embargo, en el momento en que hago esta consulta, debe ser independiente de la implementación.cuando intento de probar la unidad de esto, los métodos y
.Fetch
.ThenFetch
fallar cuando se ejecuta en contra de laIQueryable<T>
que mi repositorio proporciona simulacro.
¿Cómo puedo envolver estos dentro de mi interfaz IRepository<T>
, o en el interior de algunos métodos de extensión genéricos?
Actualización:
Hasta ahora todo lo que ocurre es que añadir esto a mi interfaz de repositorio:
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);
... y esto a mi aplicación repositorio 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);
}
El consumo de esta API ahora hace esto:
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();
Pero esto carece de la buena sintaxis del método de extensión que prefiero. Estoy buscando algo más cercano a la sintaxis .Fetch
y .ThenFetch
.
Eso es realmente bueno, pero ahora lo necesito para implementar IFetchRequest que trabaja con LINQ a objetos? – Sly
Finalmente encontré una solución a esto. ¡Gracias! – Chris
@Chris - ¿Podría compartir qué solución encontró? – Sam