Comment transférez-vous l'exécution d'une expression créée par un objet IQueryable vers un IEnumerable?

StackOverflow https://stackoverflow.com/questions/503208

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
    }
Était-ce utile?

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<>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top