Построить лямбда-выражение динамически - PullRequest
1 голос
/ 06 мая 2011

Я пытаюсь отсортировать коллекцию объектов динамически.В идеале я бы хотел, чтобы он выполнял описанные ниже функции, в которых я мог бы указать критерии во время выполнения.

_group.OrderByDescending(rec => "rec.CalculatedRecord.GL.PropertyValue").Take(Convert.ToInt16(_filters.Value))

Я пробовал динамический linq, который не работал.

var query = (from enumerable in _group
                           orderby "rec.CalculatedRecord.GL.PropertyValue").  descending 
                          select enumerable).Take(5);

Ответы [ 2 ]

0 голосов
/ 24 июня 2014

Метод 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 и генерации запросов во время выполнения, простейший пример «Где»

0 голосов
/ 06 мая 2011

Примечание о том, почему второй не должен работать: ваш объект перечисления называется enumerable, но в вашей строке вы все еще используете rec, как в лямбда-выражении ранее. изменение строки для использования enumerable вместо rec может облегчить ваши проблемы.

...