我正在使用 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(使用前将#替换为@)