Utwórz ogólne wyrażenie z nazwy właściwości łańcucha
Mam zmienną o nazwie sortColumn, która zawiera tekst kolumny, którą chcę posortować wynik zapytania według. Mam również ogólne repozytorium, które przyjmuje jako parametr wyrażenie zawierające pole, które chcę sortować. Wydaje mi się, że nie mogę przejść od nazwy właściwości łańcucha do wyrażenia.
Tak więc ogólne repozytorium, które mam, zawiera następującą metodę
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)
Zauważ, że drugi parametr tego Get to Expression-Func-TEntity, TOrderBy. Jak już wspomniałem, mam zmienną o nazwie sortColumn, która zawiera łańcuch właściwości dla mojego obiektu TEntity. Muszę przekonwertować ten ciąg na wyrażenie, które mogę przekazać do metody Get.
Oto, co mam teraz.
var parameter = Expression.Parameter(typeof(IContract));
var memberExpression = Expression.Property(parameter, data.SortColumn);
var lambdaExpression = Expression.Lambda(memberExpression, parameter);
Który tworzy obiekt typu LambdaExpression. Rzeczywistym typem tego wyrażenia LambdaExpression jest ciąg Expression-Func-IContract (lub jakikolwiek typ sortColumn właściwości). Jeśli wywołam metodę Get i przekażę to wyrażenie LambdaExpression i jawnie przekażę go do typu Expression, będzie działać poprawnie. Problem polega na tym, że nie wiem, jaki jest typ Expression, może to być łańcuch, int, int ?, itd. Wszystko zależy od typu właściwości specyficznej w właściwości sortColumn.
Czy możesz mi pomóc dokonać tego ostatniego skoku do właściwego typu Expression?
Edytuj na podstawie sugestii Marca: Prawie mam to działające, właściwie oparte na konkretnym pytaniu, ale mam 1 problem.
IContract, który jest typem encji, o który pytam, faktycznie dziedziczy z IRelationship. Jeśli określę pole z interfejsu IContract, powyższy kod działa. Jeśli określę pole z interfejsu IRelationship, to następujący wiersz zawiedzie.
var memberExpression = Expression.Property(parameter, data.SortColumn);
Jeśli spróbuję coś takiego poniżej, tak że chwytam MemberExpression z IRelationship, ale budowanie Lambda na podstawie IContract otrzymuję błąd z repozytorium.
var parameter = Expression.Parameter(typeof(IRelationship));
var memberExpression = Expression.Property(parameter, data.SortColumn);
var orderBy = Expression.Lambda(memberExpression, Expression.Parameter(typeof(IContract)));
Błąd, który otrzymuję, to „Parametr” nie został powiązany w określonym wyrażeniu zapytania LINQ to Entities. ”
Ostatecznym wyrażeniem, aby to zadziałało, było to
var parameter = Expression.Parameter(typeof(IContract));
var memberExpression = Expression.Property(parameter, typeof(IRelationship), data.SortColumn);
var orderBy = Expression.Lambda(memberExpression, parameter);
Potrzebowałem więc określić parametr middle linii memberExpression, aby powiedzieć, że spójrz w dziedziczony interfejs relacji dla właściwości