我正在使用动态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的类型?
答案 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。