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

2023-12-10

我正在使用 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 工作?


默认情况下,DynamicLinq 支持一些嵌套查询的功能IEnumerable字段,所有它在接口中定义IEnumerableSignatures like Where, Any, Count等等,但没有Orderby, Select or FirstOrDefault你需要什么。
所以你可以将它添加到这个接口中,例如

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"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Dynamic Linq 查询中嵌套 OrderBy 是如何工作的? 的相关文章

随机推荐