динамически создавать лямбда-выражения + linq + OrderByDescending

как я могу создать динамическое лямбда-выражение для использования в моей функции orderby внутри linq?

Я в основном хочу преобразовать queryResults.OrderByDescending(); в queryResults.OrderByDescending(myCustomGeneratedLambdaExp);, где myCustomGeneratedLambdaExp должна быть строкой, содержащей x => x.name.

Спасибо


person byte_slave    schedule 03.11.2009    source источник


Ответы (2)


Я не уверен, где именно вам понадобились динамические лямбда-выражения. В любом случае, лучший способ динамически генерировать лямбда-выражения - использовать деревья выражений. Вот два хороших урока по этой теме:

Этот код генерирует лямбда-выражение, подобное тому, которое вы просили ("x => x.name"):

MemberInfo member = typeof(AClassWithANameProperty).GetProperty("Name");

//Create 'x' parameter expression
ParameterExpression xParameter = Expression.Parameter(typeof(object), "x");

//Create body expression
Expression body = Expression.MakeMemberAccess(targetParameter, member);

//Create and compile lambda
var lambda = Expression.Lambda<LateBoundGetMemberValue>(
    Expression.Convert(body, typeof(string)),
    targetParameter
);
return lambda.Compile();

надеюсь это поможет

person jpbochi    schedule 03.11.2009
comment
Спасибо за хороший пример! Это мне очень помогло! - person byte_slave; 03.11.2009
comment
Обратите внимание, что первая ссылка мертва - person Peter M; 19.05.2017

См. Динамический LINQ

В качестве альтернативы вы можете использовать оператор switch, Reflection или тип dynamic в C # 4, чтобы вернуть значение на основе предоставленного имени поля.

Это также было сделано до смерти ранее

person Ruben Bartelink    schedule 03.11.2009
comment
Большое спасибо за ваш вклад! Я хочу избегать переключения кода, а отражение делает его медленнее. - person byte_slave; 03.11.2009
comment
Да, имеет смысл. Удачи с этим. Использование dynamic и / или Iron * более чистое, чем Dynamic LINQ или Reflection.emit или Expression.Compile, хотя, если вы пытаетесь сохранить свой код поддерживаемым и чистым IMO. - person Ruben Bartelink; 03.11.2009
comment
Еще раз спасибо за отличный вклад. - person byte_slave; 04.11.2009