代码之家  ›  专栏  ›  技术社区  ›  sipsorcery

动态Linq-在运行时设置orderby表达式类型

  •  2
  • sipsorcery  · 技术社区  · 15 年前

    我正在使用动态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 + "."));
    

    编译器不满意deloching命令表达式这一行。在运行时有什么方法可以设置func的类型吗?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Iswanto San Ajay2707    11 年前

    看起来动态LINQ扩展方法为我解决了所有问题。我做得太难了。

    var result = from item in table.Where("owner = \"joe\"").OrderBy("inserted") select item;
    result.ToList().ForEach(m => Console.WriteLine("inserted=" + m.Inserted + "."));
    
        2
  •  0
  •   James McCormack    15 年前

    是的-尽管一个问题是,dynamicLinq不允许您使用一个比较程序进行排序。我有一个 solution 对此。