我正在使用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工作?
答案 0 :(得分:3)
默认情况下,DynamicLinq支持针对IEnumerable
字段的嵌套查询的一些小函数,所有这些函数都在IEnumerableSignatures
,Where
,Any
,Count
等界面中定义。等,但没有您需要的Orderby
,Select
或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"