动态构建lambda表达式

时间:2011-05-06 15:39:54

标签: linq sorting dynamic lambda linq-to-objects

我正在尝试动态地对对象集合进行排序。理想情况下,我希望它能够执行以下功能,我可以在运行时指定条件。

_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 :(得分:0)

关于为什么第二个不应该工作的注释:枚举对象被称为enumerable但是在你的字符串中你仍然使用rec,就像之前的lambda一样。将字符串更改为使用enumerable代替rec可能会缓解您的问题。

答案 1 :(得分:0)

OrderByDescending方法的参数为Func<TSource, TKey>。虽然您可以在这里插入lambda,这是最常见的用例,但您也可以传入一个变量。可以根据您的逻辑来动态分配变量。

我不得不推断你的班级结构,但这是一个基本的例子:

    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 and query generation at runtime, simplest "Where" example

中的步骤操作
相关问题