У меня есть стандартное 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);
}
}