C# динамическое дерево выражений c запрос и обобщение c порядок с cultureinfo - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть стандартное c расширение OrderBy (), и оно работает хорошо, но у меня есть проблема, когда текст содержит диакритические знаки, если текст содержит диакритические знаки. «OrderBy ()» работает неправильно. По этой причине я пытался добавить StringComparer.Create(CultureInfo.GetCultureInfo("ro"), false) в метод "OrderBy ()". Это начальный код:

        public static IOrderedQueryable<TEntity> OrderBy<TEntity>(this IEnumerable<TEntity> source, string orderByProperty, bool desc)
    {
        var command = desc ? "OrderByDescending" : "OrderBy";
        var type = typeof(TEntity);
        var property = type.GetProperty(orderByProperty);
        var parameter = Expression.Parameter(type, "p");
        var propertyAccess = Expression.MakeMemberAccess(parameter, property);
        var orderByExpression = Expression.Lambda(propertyAccess, parameter);

        var resultExpression = Expression.Call(typeof(Queryable), command, new[] { type, property.PropertyType},
            source.AsQueryable().Expression, orderByExpression);

        return (IOrderedQueryable<TEntity>)source.AsQueryable().Provider.CreateQuery<TEntity>(resultExpression);
    }

Этот код создает следующий запрос source.OrderBy(p => p.Name), но я хочу создать запрос, подобный этому source.OrderBy(p => p.Name, StringComparer.Create(CultureInfo.GetCultureInfo("ro"), false)).

Поэтому я попытался построить его, но я У меня нет большого опыта работы с деревом выражений, и этот код не работает.

        public static IOrderedQueryable<TEntity> OrderBy2<TEntity>(this IEnumerable<TEntity> source,
        string orderByProperty, bool desc)
    {
        var command = desc ? "OrderByDescending" : "OrderBy";
        var type = typeof(TEntity);
        var property = type.GetProperty(orderByProperty);
        var parameter = Expression.Parameter(type, "p");
        var propertyAccess = Expression.MakeMemberAccess(parameter, property);
        var orderByExpression = Expression.Lambda(propertyAccess, parameter);

        var ex = Expression.Call(typeof(Comparer).GetMethod("CultureComparer"));

        var resultExpression = Expression.Call(typeof(Queryable), command, new[] { type, property.PropertyType, typeof(StringComparer) },
            source.AsQueryable().Expression, orderByExpression, ex);

        return (IOrderedQueryable<TEntity>)source.AsQueryable().Provider.CreateQuery<TEntity>(resultExpression);
    }
}

public static class Comparer
{
    public static StringComparer CultureComparer()
    {
        return StringComparer.Create(CultureInfo.GetCultureInfo("ro"), false);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...