如何在Dynamic Linq查询中嵌套OrderBy工作?

时间:2014-09-26 06:40:33

标签: c# linq dynamic-linq

我正在使用Dynamic Linq,今天我想构建一个稍微复杂的嵌套查询:

"Composition
.Where(((ExpirationDate > DateTime.UtcNow.Date) && (ExpirationDate.Year != 9999)))
.OrderBy(\"ExpirationDate ASC\")
.Select(ExpirationDate)
.FirstOrDefault() == @0"

(休息只是为了这篇文章的可读性,而不是真的存在于代码中)

查询由字符串变量保存并传递给它:

private static Func<IQueryable<T>, object, IQueryable<T>> CreateWhereExpression<T>(string whereClause) where T : class
{
     return (q, o) => q.Where(whereClause, o);
}

愉快地创建了Where表达式。 (注意whereClause包含“Composition.Where ....”上方的确切字符串) 但是一旦执行,它就会抱怨:

  

没有适用的聚合方法'OrderBy'存在

所以我的问题是,我做错了什么?如何让嵌套的OrderBy工作?

1 个答案:

答案 0 :(得分:3)

默认情况下,DynamicLinq支持针对IEnumerable字段的嵌套查询的一些小函数,所有这些函数都在IEnumerableSignaturesWhereAnyCount等界面中定义。等,但没有您需要的OrderbySelectFirstOrDefault 所以你可以把它添加到这个界面,如

interface IEnumerableSignatures
{
    ....
    void OrderBy(object selector);
    void Select(object selector);
    void FirstOrDefault();
}

之后你需要像这样修复ParseAggregate方法

Expression ParseAggregate(Expression instance, Type elementType, string methodName, int errorPos)
{
    ....
    if (signature.Name == "Min" || signature.Name == "Max" 
        || signature.Name == "OrderBy" || signature.Name == "Select" //add this for support OrderBy and Select that need two generic parameters
    )
    ....
}

最后下一个查询将起作用

"Composition
.Where((ExpirationDate > DateTime.UtcNow.Date) && (ExpirationDate.Year != 9999))
.OrderBy(ExpirationDate)
.Select(ExpirationDate)
.FirstOrDefault() == @0"