example - iqueryable c# ejemplos
Lista<T> para implementar IQueryable<T> (2)
El motivo de su problema es que si realiza AsQueryable
, comprueba si el objeto ya implementa IQueryable
y si sí lo devuelve.
Use la new EnumerableQuery<T>(this)
lugar de AsQueryable
que no realiza esta comprobación.
Solución para .net 3.5:
return ((IEnumerable<T>)this).Select(x=>x).AsQueryable()
La primera vez que se IEnumerable<T>
a IEnumerable<T>
el método de Select
elegido será Enumerable.Select
no Queryable.Select
. La selección de identidad devolverá un nuevo objeto que no implementa IQueryable<T>
, por lo que la comprobación si se implementa en AsQueryable
falla.
Estoy tratando de crear un simulacro para mi interfaz IRepository
:
public interface IRepository<T> : ICollection<T>, IQueryable<T>
{
}
Con esta implementación:
public class RepositoryFake<T> : List<T>, IRepository<T>
{
public Expression Expression
{
get
{
return this.AsQueryable().Expression;
}
}
public Type ElementType
{
get
{
return this.AsQueryable().ElementType;
}
}
public IQueryProvider Provider
{
get
{
return this.AsQueryable().Provider;
}
}
}
Pero cuando lo uso, estoy obteniendo la excepción StackOverflow
. ¿Cómo implementar esta interfaz correctamente para poder usar solo una List
como repositorio?
El uso es muy simple.
[Test]
public void Test()
{
RepositoryFake<User> users = new RepositoryFake<User>();
users.Add(new User());
List<User> list = (from user in users
where user.Id == "5"
select user).ToList();
Assert.That(list, Is.Empty);
}
Aquí está la captura de pantalla de la excepción:
Intente usar base.AsQueryable()
lugar de this.AsQueryable()
.