Comment transférez-vous l'exécution d'une expression créée par un objet IQueryable vers un IEnumerable?
-
20-08-2019 - |
Question
Dans mon code, je souhaite rendre mes référentiels IQueryable. De cette façon, les critères de sélection seront un arbre d’expression linq.
Maintenant, si je veux simuler mon référentiel dans une théorie, c’est très simple: il suffit de mettre en œuvre l’interface de mon référentiel (qui est également un objet IQueryable).
Mon implémentation de référentiel factice ne serait qu'une collection en mémoire, mais ma question est la suivante: connaissez-vous un moyen simple d'implémenter l'interface IQueryable de ma maquette, pour transférer la requête vers ma collection en mémoire (IEnumerable)? <
Merci pour votre réponse,
Une certaine précision
L'objet client de mon référentiel utilisera mon référentiel de la manière suivante:
var result = de l'entrée dans MyRepository où entry.Product == " SomeProduct " sélectionnez l'entrée;
La tâche ToList ou AsEnumerable consiste à exécuter la requête et à renvoyer le résultat sous la forme d'une liste ou d'un IEnumerable. Mais je dois implémenter l'interface IQueryable sur mon référentiel, avec un IQueryProvider qui transforme l'expression en un appel à un objet IEnumerable.
Solution
L'implémentation de la solution consiste à déléguer l'appel à IQueryable à ma collection inmemory avec AsQueryable.
public class MockRepository : IQueryable<DomainObject>
{
private List<DomainObject> inMemoryList = new List<DomainObject>();
#region IEnumerable<DomainObject> Members
public IEnumerator<DomainObject> GetEnumerator()
{
return inMemoryList.GetEnumerator();
}
#endregion
#region IEnumerable Members
IEnumerator IEnumerable.GetEnumerator()
{
return inMemoryList.GetEnumerator();
}
#endregion
#region IQueryable Members
public Type ElementType
{
get
{
return inMemoryList.AsQueryable().ElementType;
}
}
public Expression Expression
{
get
{
return inMemoryList.AsQueryable().Expression;
}
}
public IQueryProvider Provider
{
get
{
return inMemoryList.AsQueryable().Provider;
}
}
#endregion
}
La solution
Utilisez AsQueryable sur vos simulacres. Désormais, ils sont interrogeables et vous pouvez les traiter comme n'importe quel autre objet interrogeable.
Autres conseils
Pouvez-vous utiliser la méthode d'extension
.ToList<>