【发布时间】:2016-01-20 12:20:52
【问题描述】:
我希望我的 Web API 能够按如下字符串参数对其输出进行排序:
http://myapi.com/api/people?skip=0&take=50&orderBy=lastName&descending=true.
因为我的 API 中也有分页支持(skip和take),所以我希望将orderBy 和descending 参数直接应用于SQL 查询,以便得到正确的结果来自数据库。
但是,当这样做时,当尝试将orderBy 的参数与我希望仅使用字符串比较进行排序的类的实际属性相匹配时,代码可能会变得非常难以管理。
我找到了一个solution,它应该可以与 LINQ to Entities 一起使用,因此也可以与新的 EF7 一起使用,但是当我尝试使用新的 Core CLR 编译此代码时,我收到以下消息:
错误 CS1503 参数 2:无法从 'System.Linq.Expressions.Expression>' 转换为 'string'
解决方案中失败的代码是OrderBy<T>method:
public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string propertyName)
{
return source.OrderBy(ToLambda<T>(propertyName));
}
似乎新的 Core CLR 不支持这种尝试。是否有另一种方法可以使解决方案与新的 CLR 一起使用?如果不是,我必须使用 EF7 启用排序而不导致无数 if 或 switch 语句将输入字符串与属性名称进行比较?
【问题讨论】:
-
为什么不在 Web API 上使用 OData? asp.net/web-api/overview/odata-support-in-aspnet-web-api
-
哪一行代码给你这个错误?在此处包括失败的 sn-p。
-
我以前看过 OData。它是否与新的 ASP.NET 5 和 EF7 一起正常工作?是否将排序参数正确映射到 SQL 查询?
-
oData 与 asp.net 5 和 EF7 一起正常工作。
-
我猜你尝试调用 .OrderBy(ToLambda
(propertyName)) 而不是 .OrderBy(propertyName) ,然后因为你使用重载,所以一切都搞砸了。在您的实际列表中尝试执行 myList.OrderBy(propertyName);它可能会给出编译器错误,这意味着您的列表不是 typeof(IQueryable ) 那么您知道您必须执行 myList.AsQueryable().OrderBy(propertyName);它与 CLR 无关,只是您混淆了从其他帖子中获取的重载。
标签: c# asp.net linq asp.net-core entity-framework-core