2016-05-25 7 views
2

Ich habe den folgenden Aufruf in meinem ViewModel.Ausdrücke, die an die Repository-Methode übergeben werden, werden nicht korrekt kompiliert.

Order order= await DataService.Orders.GetAsync(p => p.Id == Guid.Parse("07fafcd9-10db-e511-848d-005056b94716")); 

die Aufträge Repository hat die folgende Methode.

public async Task<T> GetAsync(Expression<Func<T, bool>> predicate) 
{ 
    return await Db.FindAsync<T>(predicate).ConfigureAwait(false); 
} 

Db Eigenschaft ist vom Typ SQLiteAsyncConnection. Das oben angegebene Prädikat I wird in die folgende Darstellung übersetzt.

{p => (p.Id == Parse("07fafcd9-10db-e511-848d-005056b94716"))} 

Die obige Prädikat wird eine Ausnahme mit der folgenden Meldung

keine solche Funktion werfen:

So analysieren ich das Bestehen der Guid.Parse Funktion nach unten, die nicht existiert, ähnliche Ausnahme wird es geworfen, wenn ich das folgende Prädikat habe.

Order order= await DataService.Orders.GetAsync(p => p.Id == anotherInstanceObject.Id); 

Die Lösung ist, meinen Code mit der Übergabe des tatsächlichen Wertes zu ersetzen.

Guid guid = Guid.Parse("07fafcd9-10db-e511-848d-005056b94716"); 
Order order= await DataService.Orders.GetAsync(p => p.Id == guid); 

Aber der oben ist so unlogisch und wird eine Menge Probleme vorstellen, wenn Entwickler beginnen die DataService Klasse.

Ich verwende SQLite.Net-PCL für meinen Datenzugriff.

Was fehlt mir, damit das Prädikat korrekt auf meine Repository-Methode kompiliert wird?

Antwort

2

Linq-Anbieter unterscheiden sich in den von ihnen unterstützten Mustern. Ihr erkennt nicht Guid.Parse. Ist das EF? Es ist bekannt, dass EF viele grundlegende .NET Framework-Funktionen nicht erkennt, die tatsächlich in SQL übersetzt oder lokal ausgewertet werden könnten.

was ich

bin nichts fehlt. Es gibt keine Möglichkeit, EF dies zu ermöglichen, abgesehen davon, EF zu patchen oder einen eigenen Proxy-LINQ-Provider zu schreiben, der eine Woche Arbeit wert ist.

Sie müssen damit leben. Sie würden das gleiche Problem ohne ein Repository haben. Sie können solche Linq-Abfragen mit EF einfach nicht schreiben.

+0

Ich verwende https://github.com/oysteinkrog/SQLite.Net-PCL für meinen Datenzugriff lokal. Ich hatte gehofft, dass ich nicht damit leben muss, irgendwelche Links, wo ich anfangen kann, zu erforschen, wie man dieses Schreiben meines eigenen Proxy-LINQ-Anbieters repariert? –

+0

Google für "LINQ-Anbieter" ... Sie werden sich wahrscheinlich nicht mit diesem Ansatz zufrieden geben. Es ist Raketenwissenschaft. Ich weiß, weil ich ein ausgeklügeltes geschrieben habe, das viele Dinge tut. Warum benutzen Sie diesen eher exotischen Linq-Anbieter? Ich würde zuerst die Mainstream-EF versuchen. Die Verwendung solcher Nischen-Frameworks für Core-Infrastrukturen, die schwer zu ersetzen sind, ist eine fragwürdige Strategie. – usr

+0

Ich kann EF nicht verwenden, muss eine Cross-Plattform-Lösung unterstützen und sqlite-net-pcl ist der Weg zu gehen. –