Wie übertragen Sie die Ausführung eines Expression von einem IQueryable Objekt zu einem IEnumerable erstellt?

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

Frage

In meinem Code würde Ich mag an meine Repositories IQueryable machen. Auf diese Weise werden die Kriterien für die Auswahl wird ein Linq Ausdruck Baum sein.

Nun, wenn ich meinen Repository in theorie dies verspotten will, ist sehr einfach. Nur die Schnittstelle von meinem Repository implementieren (die auch ein IQueryable-Objekt ist)

Meine Mock-Repository Implementierung sei nur ein in Erinnerung Sammlung, aber meine Frage ist: Kennen Sie eine einfache Möglichkeit, die IQueryable Schnittstelle meine mock zu implementieren, um die Abfrage zu meiner In-Memory-Sammlung (IEnumerable) zu übertragen

Vielen Dank für Ihre Antwort,

Einige Präzision

Das Client-Objekt meiner Repository wird mein Repository auf diese Weise verwenden:

var result = von Eintrag in MyRepository wo entry.Product == "SomeProduct" Eintrag auswählen;

Was bedeutet ToList oder AsEnumerable ist die Abfrage auszuführen und das Ergebnis als Liste oder als IEnumerable zurück. Aber ich habe die IQueryable-Schnittstelle auf meinem Repository zu implementieren, mit einem IQueryProvider, die die Expression in einem Aufruf ein IEnumerable-Objekt umwandeln.

Lösung

Die Implementierung der Lösung wird Aufruf zu delegieren meine inmemory Sammlung IQueryable mit 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
    }
War es hilfreich?

Lösung

Verwenden Sie AsQueryable auf Mocks. Jetzt sind sie abfragbar und Sie können sie wie jede andere abfragbaren zu behandeln.

Andere Tipps

Können Sie die Erweiterungsmethode verwenden

.ToList<>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top