gpt4 book ai didi

c# - 使用属性名称作为字符串进行排序

转载 作者:行者123 更新时间:2023-11-30 13:55:24 29 4
gpt4 key购买 nike

我希望我的 Web API 能够通过字符串参数对其输出进行排序,例如:

http://myapi.com/api/people?skip=0&take=50&orderBy=lastName&descending=true .

因为我的 API 也有分页支持(使用 skiptake ),所以我想要 orderBydescending直接应用于 SQL 查询的参数,以便正确的结果来自数据库。

然而,当这样做时,当试图匹配 orderBy 的参数时,代码会变得非常难以管理。与我希望仅使用字符串比较来排序的类的实际属性。

我找到了 solution它应该与 LINQ to Entities 一起工作,因此也与新的 EF7 一起工作,但是当我尝试使用新的 Core CLR 编译此代码时,我收到以下消息:

Error CS1503 Argument 2: cannot convert from 'System.Linq.Expressions.Expression>' to 'string'

失败解决方案的代码是 OrderBy<T>方法:

public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string propertyName)
{
return source.OrderBy(ToLambda<T>(propertyName));
}

新的 Core CLR 似乎不支持这种尝试。有没有其他方法可以使解决方案与新的 CLR 一起工作?如果不是,我还必须使用哪些其他替代方法来启用使用 EF7 进行排序而不会导致无数 ifswitch将输入字符串与属性名称进行比较的语句?

最佳答案

您链接中的解决方案使用“Expression.Convert”,大多数情况下不适用于 LINQ to Entities。

这是一个有效的扩展方法:

public static IOrderedQueryable<TSource> OrderBy<TSource>(this IQueryable<TSource> source, string propertyName)
{
// LAMBDA: x => x.[PropertyName]
var parameter = Expression.Parameter(typeof(TSource), "x");
Expression property = Expression.Property(parameter, propertyName);
var lambda = Expression.Lambda(property, parameter);

// REFLECTION: source.OrderBy(x => x.Property)
var orderByMethod = typeof(Queryable).GetMethods().First(x => x.Name == "OrderBy" && x.GetParameters().Length == 2);
var orderByGeneric = orderByMethod.MakeGenericMethod(typeof(TSource), property.Type);
var result = orderByGeneric.Invoke(null, new object[] { source, lambda });

return (IOrderedQueryable<TSource>)result;
}

免责声明:我是项目的所有者EF+在 GitHub 上。

您可以在我的存储库中找到其他按属性名称排序的方法:GitHub

  • 降序排序
  • 然后通过
  • 然后按降序
  • AddOrAppendOrderBy
  • AddOrAppendOrderByDescending

编辑:回答子问题

Is it possibly to sort by navigation properties using something like this, e.g. a property name "NavigationProperty.PropertyName"

是的,您可以拆分字符串并循环以使用属性路径创建表达式,也可以使用真正的表达式求值器。

免责声明:我是项目的所有者Eval-Expressions.NET

此库允许您动态执行所有 LINQ 方法。

参见:LINQ Dynamic

var result = list.OrderByDynamic(x => "NavigationProperty.PropertyName");

关于c# - 使用属性名称作为字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34899933/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com