Ich habe eine Datenschicht, die abstrahiert die zugrunde liegende Implementierung (Entity Framework) durch die Annahme von & Rückgabe von Modellen, die an anderer Stelle definiert sind. Ich möchte in der Lage sein, ein Func<T, bool>
Prädikat an eine der Methoden zu übergeben, um zuzulassen, dass zusätzliche Klauseln bei der Abfrage der Datenbank angewendet werden.Convert Func <TSource, bool> Prädikat zu Func <TDest, bool> Prädikat
Da die generischen Modelle nichts über die zugrunde liegende Entity Framework-Implementierung wissen, muss ich mein Func<T, bool>
-Prädikat in ein Prädikat konvertieren, das auf den Entity Framework-Kontext angewendet werden kann.
Die generischen Modelle & Entity Framework-Modelle haben genau die gleichen Eigenschaftsnamen & Ich habe bereits eine Klasse, um die Eigenschaftswertzuordnungen zwischen den beiden durchzuführen. Gibt es eine Möglichkeit, den Zieltyp des generischen Modelldelegaten in den des Entity Framework-Modells zu konvertieren?
Ein Beispiel dessen, was ich bin versucht zu tun: dieser Delegat Gegeben: dbFunc = Func<Models.Order, bool>
und es auf den Kontext: func = Func<Schema.Data.Order, bool>
ich es konvertieren wollen ctx.Orders.Where(dbDel)
ich this Post gefunden, aber ich kann nicht zusammenfügen, wie die Konvertierung durchgeführt wird. Ich habe mir den ganzen Abend den Kopf dagegen gestoßen, also würde jede Hilfe sehr geschätzt!
UPDATE
Die ursprüngliche Frage & Anforderungen scheinen etwas vage gewesen zu sein, ich werde auf meine Implementierung so erarbeiten & meine Anforderungen. Die folgenden Codebeispiele wurden geändert, um Expression<Func<TIn, TOut>>
& nicht Func<TIn, TOut>
zu verwenden, basierend auf den Vorschlägen von hvd & Alexei.
Ich habe eine Schnittstelle & eine Reihe von Klassen, die meine Datenschicht darstellen. Diese fungieren als Fassade über der Datenquelle und ermöglichen verschiedene Implementierungen für den Zugriff auf die Datenbank. Ich möchte zusätzliche Filterkriterien übergeben können, da ein Prädikat & dies auf die zugrunde liegende Datenquelle anwenden soll. Da die Fassade jedoch von der zugrunde liegenden Implementierung getrennt ist, wird das Prädikat anhand der Fassadenmodellklassen definiert. Darüber hinaus haben die Eigenschaften der Fassadenmodell-Klassen dieselbe Bezeichnung wie meine Implementierung, so dass beispielsweise direkte Eigenschaftszuweisungen durch Reflektion möglich sind.
Meine Fassade Umsetzung:
namespace Schema.Data
{
public interface IDataStore
{
public IEnumerable<Order> GetOrders(string custCode, Expression<Func<Order, bool>> exp);
}
public class Order
{
public string CustomerCode { get; set; }
public string OrderNumber { get; set; }
}
}
ich die Schnittstelle in einem eigenen Namensraum dann implementieren, Entity Framework mit meiner Datenbank abzufragen:
namespace Data.EF
{
// Entity Framework model is in this same namespace
public class DataStore : Schema.Data.IDataStore
{
public IEnumerable<Schema.Data.Order> GetOrders(string custCode, Expression<Func<Schema.Data.Order, bool>> exp)
{
using (var ctx = new MyDatabaseEntities()) {
// TODO: Convert "exp" to Expression<Func<Data.EF.Order, bool>> to pass it in below
var orders = ctx.Orders.Where(e => e.CustomerCode == custCode).Where(dbExp ?? (n => true));
// handling the retrieved data & returning result goes here
}
}
}
}
'Func dbFunc = order => func (MapSchemaToModel (order)); '... oder suchst du eine bessere Konvertierung? –
Für EF, um etwas nützliches zu erhalten, benötigen Sie einen 'Ausdruck>', kein 'Func '. Welches ist das, was in dem Post verwendet wird, zu dem Sie verlinken, aber nicht nach dem, was Sie in Ihrer Frage hier fragen? –
hvd
Sie möchten einen Typ in einen anderen konvertieren, auf den Sie nicht zugreifen können (oder wollen)? Es kommt mir seltsam vor. – HimBromBeere