动态Linq - 在运行时设置表达式的顺序

时间:2009-06-05 01:39:48

标签: c# dynamic-linq

我正在使用动态Linq并且where子句有效。现在我想添加orderby子句,但是我遇到了设置动态表达式类型的问题。下面是我的工作代码:

class MyClass {
    public string Owner;
    public DateTime Inserted;
}

Expression<Func<MyClass, bool>> whereExpression = DynamicExpression.ParseLambda<MyClass, bool>("owner = \"joe\"");
Expression<Func<MyClass, DateTime>> orderExpression = DynamicExpression.ParseLambda<MyClass, DateTime>("inserted");
var result = from item in table.Where(whereExpression).OrderBy(orderExpression) select item;
result.ToList().ForEach(m => Console.WriteLine("inserted=" + m.Inserted + "."));

因为我需要在orderby表达式中使用不同的属性,所以我希望能够使用类似下面代码的东西。

Expression<Func<MyClass, bool>> whereExpression = DynamicExpression.ParseLambda<MyClass, bool>("owner = \"joe\"");
Type orderType = typeof(DateTime);
Expression<Func<MyClass, orderType>> orderExpression = DynamicExpression.ParseLambda<MyClass, orderType>("inserted");
var result = from item in table.Where(whereExpression).OrderBy(orderExpression) select item;
result.ToList().ForEach(m => Console.WriteLine("inserted=" + m.Inserted + "."));

编译器对delcaring orderExpression的行感到不满意。有没有办法在运行时设置Func的类型?

2 个答案:

答案 0 :(得分:3)

看起来动态的Linq扩展方法可以解决所有这些问题。我太难了。

var result = from item in table.Where("owner = \"joe\"").OrderBy("inserted") select item;
result.ToList().ForEach(m => Console.WriteLine("inserted=" + m.Inserted + "."));

答案 1 :(得分:0)

是的 - 虽然一个问题是DynamicLinq不允许您使用IComparer进行排序。我有一个solution