Следующий код отлично работает, я хочу динамически строить заказ по:
public static IQueryable<TEntity> OrderByAnyField<TEntity>(this IQueryable<TEntity> source, string orderByProperty, bool desc, Type propertyType)
{
string 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[] { type, property.PropertyType },
source.Expression, Expression.Quote(orderByExpression));
return source.Provider.CreateQuery<TEntity>(resultExpression);
}
Итак, я хочу иметь возможность изменить тип CAST. Итак, в качестве примера я бы хотел взять:
.OrderBy(x => x.Something)
и сделайте это вместо этого:
.OrderBy(x => double.Parse(x.Something))
Любая помощь приветствуется
Мне нужно динамически сортировать по переданному имени столбца. Еще мне нужно «забросить» столбик. Итак, я использую приведенный выше код для сортировки по переданному имени столбца. (т.е. .OrderByAnyField (переданноеColumnName, false, typeof (double))). passColumnName может быть именем любого столбца в источнике.
Позвольте мне добавить к своему комментарию для ясности. Я могу сортировать по столбцу, так же, как .OrderBy (x => x.Something). Я хотел бы выполнить сортировку путем преобразования в другой тип данных, например .OrderBy (x => double.Parse (x.Something)). Если я попытаюсь использовать другой тип данных в resultExpression, я получу сообщение об ошибке:
Я использую один более простой подход к тому же. Вы можете добавить дженерики в соответствии с вашими требованиями. Вы можете играть с данными как хотите
static object GetOrder(Table tb, string propertyName, bool desc)
{
if (desc)
return 0;
PropertyInfo pI = typeof(Table).GetProperty(propertyName);
var val = pI.GetValue(tb);
return val;
}
static object GetOrderDesc(Table tb, string propertyName, bool desc)
{
if (!desc)
return 0;
PropertyInfo pI = typeof(Table).GetProperty(propertyName);
var val = pI.GetValue(tb);
return val;
}
static void Main(string[] args)
{
bool desc = false;
List<Table> table = new List<Table>() {
new Table() { ID = "03", X = "Str1", Y = "C1", P = 10 },
new Table() { ID = "04", X = "Str1", Y = "C1", P = 5 },
new Table() { ID = "05", X = "Str1", Y = "C1", P = 1 },
new Table() { ID = "06", X = "Str1", Y = "C1", P = 2 },
new Table() { ID = "07", X = "Str2", Y = "C1", P = 25 },
new Table() { ID = "08", X = "Str2", Y = "C1", P = 4 },
new Table() { ID = "09", X = "Str1", Y = "C2", P = 411 },
new Table() { ID = "10", X = "Str1", Y = "C2", P = 2356 },
new Table() { ID = "11", X = "Str2", Y = "C2", P = 12 },
new Table() { ID = "12", X = "Str2", Y = "C2", P = 33 },
};
var sortedTable = table.OrderBy(x => GetOrder(x, "P", desc)).OrderByDescending(x => GetOrderDesc(x, "P", desc));
}
Когда linq уже дает вам возможность сортировать по любому свойству, чего здесь добиваться?