Метод OrderByDescending
принимает параметр Func<TSource, TKey>
. Хотя вы можете вставить здесь лямбду, как это наиболее распространенный вариант использования, вы также можете передать переменную. Переменная может быть назначена динамически в зависимости от вашей логики.
Мне пришлось вывести структуру вашего класса, но вот базовый пример:
public class Record
{
public CalculatedRecord CalculatedRecord { get; set; }
}
public class CalculatedRecord
{
public GL GL { get; set; }
}
public class GL
{
public PropertyValue PropertyValue1 { get; set; }
public PropertyValue PropertyValue2 { get; set; }
}
public class PropertyValue { }
Тогда вы можете создать следующую логику:
public class TestHarness
{
public void Test()
{
IEnumerable<Record> Group = new List<Record>();
//Simple flag
bool someCriteria = true;
//Define orderByFunc
Func<Record, PropertyValue> orderByFunc;
//Assign the order by function based on someCriteria
if (someCriteria)
{
orderByFunc = record =>
record.CalculatedRecord.GL.PropertyValue1;
}
else
{
orderByFunc = record =>
record.CalculatedRecord.GL.PropertyValue2;
}
//Execute OrderBy
var updated = Group.OrderByDescending(orderByFunc).Take(5);
}
}
Однако это не позволяет вам динамически генерировать Func во время выполнения. Для этого вам нужно будет построить Expression
, используя деревья выражений, а затем скомпилировать его. Вы можете выполнить шаги в Expression.Lambda и генерации запросов во время выполнения, простейший пример «Где»