gpt4 book ai didi

c# - 按 lambda 表达式动态排序

转载 作者:行者123 更新时间:2023-11-30 19:09:52 25 4
gpt4 key购买 nike

我正在我的应用程序中进行排序,如下所示。

public IQueryable<Users> SelectAll(string sSortExpression, string sSortOrder)
{
if (sSortOrder == "asc")
{
switch (sSortExpression)
{
case "FirstName":
return UsersRepository.Entities.OrderBy(x => x.FirstName);
case "LastName":
return UsersRepository.Entities.OrderBy(x => x.LastName);
default:
return UsersRepository.Entities.OrderBy(x => x.Id);
}
}
else
{
switch (sSortExpression)
{
case "FirstName":
return UsersRepository.Entities.OrderByDescending(x => x.FirstName);
case "LastName":
return UsersRepository.Entities.OrderByDescending(x => x.LastName);
default:
return UsersRepository.Entities.OrderByDescending(x => x.UserName);
}
}
}

现在没问题了,但我必须对 Users 表中的所有字段(大约 30 个字段)进行排序。那么方法会很大

我试过像这样使用反射

public IQueryable<Users> SelectAll(string sSortExpression, string sSortOrder)
{
var _property = UsersRepository.GetType().GetProperties().Where(a => a.Name == sSortExpression);
if (sSortOrder == "asc")
{
return UsersRepository.Entities.OrderBy(x => _property);
}
else
{
return UsersRepository.Entities.OrderByDescending(x => _property);
}
}

但是失败了。

有没有更好的方法来做到这一点?提前致谢

最佳答案

最简单的方法:更改您的方法以接受 Expression 而不是 string:

public IQueryable<Users> SelectAll<TProp>(Expression<Func<Users, TProp>> selector, string sSortOrder)
{
if (sSortOrder == "asc")
{
return UsersRepository.Entities.OrderBy(selector);
}
else
{
return UsersRepository.Entities.OrderByDescending(selector);
}
}

你可以这样调用它:

SelectAll(x => x.LastName, "asc");

或者如果你真的需要它是字符串,你必须使用 System.Linq.Expressions.Expression 类方法生成表达式树:

public IQueryable<Users> SelectAll<TProp>(string sSortExpression, string sSortOrder)
{
var param = Expression.Parameter(typeof(Users));
var propExpression = Expression.Lambda<Func<Users, TProp>>(Expression.Property(param, sSortExpression), param);

if (sSortOrder == "asc")
{
return UsersRepository.Entities.OrderBy(propExpression);
}
else
{
return UsersRepository.Entities.OrderByDescending(propExpression);
}
}

但它需要在 SelectAll 调用时指定泛型类型参数:

var results = SelectAll<int>("Id", "asc");

关于c# - 按 lambda 表达式动态排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21594902/

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