Wie übertragen Sie die Ausführung eines Expression von einem IQueryable Objekt zu einem IEnumerable erstellt?
-
20-08-2019 - |
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
}
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<>