Erstellen Sie einen generischen Ausdruck aus dem Namen der Zeichenfolgeeigenschaft
Ich habe eine Variable namens sortColumn, die den Text einer Spalte enthält, nach der ich ein Abfrageergebnis sortieren möchte. Ich habe auch ein generisches Repository, das als Parameter einen Ausdruck verwendet, der das Feld enthält, nach dem ich sortieren möchte. Ich kann scheinbar nicht vom Namen der Zeichenfolgeeigenschaft zu einem Ausdruck gelangen.
Das generische Repository, das ich habe, enthält also die folgende Methode
public IEnumerable<TEntity> Get<TOrderBy>(Expression<Func<TEntity, bool>> criteria,
Expression<Func<TEntity, TOrderBy>> orderBy, int pageIndex,
int pageSize,
bool isAssendingOrder = true,
EnumDeletePolicy deletePolicy = EnumDeletePolicy.ExcludeDeleted)
Beachten Sie, dass der zweite Parameter dieses Get Expression-Func-TEntity TOrderBy ist. Wie bereits erwähnt, habe ich eine Variable namens sortColumn, die die Zeichenfolge für eine Eigenschaft in meinem TEntity-Objekt enthält. Diese Zeichenfolge muss in einen Ausdruck konvertiert werden, den ich an die Get-Methode übergeben kann.
Hier ist, was ich gerade habe.
var parameter = Expression.Parameter(typeof(IContract));
var memberExpression = Expression.Property(parameter, data.SortColumn);
var lambdaExpression = Expression.Lambda(memberExpression, parameter);
Womit ein Objekt vom Typ LambdaExpression erstellt wird. Der tatsächliche Typ dieser LambdaExpression ist ein Expression-Func-IContract, ein String (oder was auch immer der Typ sortColumn der Eigenschaft ist). Wenn ich die Get-Methode aufrufe und diese LambdaExpression übergebe und sie explizit in den Expression-Typ umwandle, funktioniert sie einwandfrei. Das Problem ist, dass ich nicht weiß, was der Ausdruckstyp ist. Es kann sich um einen String, int, int? Usw. handeln. Dies hängt alles vom Typ der Eigenschaft ab, die in der sortColumn-Eigenschaft angegeben ist.
Können Sie mir helfen, diesen letzten Sprung zum richtigen Ausdruckstyp zu machen?
Bearbeiten auf der Grundlage von Marc's Vorschlägen: Ich habe beinahe diese Funktion, tatsächlich basierend auf der Frage, die es funktioniert, aber ich habe 1 verbleibendes Problem.
Der IContract, bei dem es sich um den Entitätstyp handelt, den ich abfrage, erbt tatsächlich von IRelationship. Wenn ich ein Feld aus der IContract-Schnittstelle spezifiziere, funktioniert der obige Code. Wenn ich ein Feld aus der IRelationship-Schnittstelle spezifiziere, schlägt die folgende Zeile fehl.
var memberExpression = Expression.Property(parameter, data.SortColumn);
Wenn ich so etwas wie das Folgende versuche, damit ich die MemberExpression aus dem IRelationship nehme, aber das Lambda auf der Basis von IContract erstelle, wird eine Fehlermeldung aus dem Repository angezeigt.
var parameter = Expression.Parameter(typeof(IRelationship));
var memberExpression = Expression.Property(parameter, data.SortColumn);
var orderBy = Expression.Lambda(memberExpression, Expression.Parameter(typeof(IContract)));
Die Fehlermeldung lautet "Der Parameter '' wurde im angegebenen LINQ to Entities-Abfrageausdruck nicht gebunden."
Der letzte Ausdruck, um es zum Laufen zu bringen, war dieser
var parameter = Expression.Parameter(typeof(IContract));
var memberExpression = Expression.Property(parameter, typeof(IRelationship), data.SortColumn);
var orderBy = Expression.Lambda(memberExpression, parameter);
Daher musste ich den mittleren Parameter für die Zeile memberExpression angeben, um beispielsweise in der geerbten Beziehungsschnittstelle nach der Eigenschaft zu suchen