如何在 C# 中基于字符串 属性 名称在 linq orderBy 中给出 属性 名称
How to give Property Name in linq orderBy based on string Property name in C#
我正在根据列名称执行排序功能。下降时有 24 列我正在根据下降的方向进行切换条件。
所以我指定了基于降序的切换条件用于升序,只有一个基于传入列的默认条件 name.i 不希望升序的条件。
我在这里尝试获取 属性 名称并默认按顺序传递,但它不起作用。
谁能提供更好的解决方案
public Static List<Students> Sort( string columnname , bool direction, List<Student> students){
Switch(columnname){
case "Name" when direction= false;
students.OrderByDescending(n=> n.Name)).ToListAsync();
break;
case "Marks" when direction= false;
students.OrderByDescending(n=> n.Marks).ToListAsync();
break;
etc 25 columns
default: // trying to pass a column name dynamically but the order is not working
var getPropertyName = nameof(columnname);
students.OrderBy(n=> getPropertyName).ToListAsync(); //
尝试使用传入的 属性 名称。
// Used reflection
var convertProperty = typeof(Student).GetProperty(columnname);
students.OrderByDescending(n=> convertProperty)).ToListAsync();
// 但无论我们执行什么订单,订单都不起作用
if try with a specific column name it is working
students.OrderBy(n=> n.Subjects)).ToListAsync();
students.OrderBy(n=> n.Marks)).ToListAsync();
}
return students
}
你的倒数第二个例子实际上非常接近应该起作用的东西。
忽略周围的一切,下面应该是上述示例的工作版本:
// Used reflection
var convertProperty = typeof(Student).GetProperty(columnname);
students.OrderByDescending(n => convertProperty.GetValue(n).ToString() ?? string.Empty).ToListAsync();
公平地说,我还没有尝试过这段代码,所以我可能在某处犯了错误,因为这是在没有 IDE 的情况下自由输入的,但它应该给出了一个大概的想法,对吧?
编辑
如果您使用的是 C# 6.0 及以上版本,您可以像上面提到的那样使用 null 检查,否则您也可以使用以下内容
students.OrderByDescending(n => (convertProperty.GetValue(n) ?? string.Empty).ToString()).ToListAsync();
您可以轻松使用此代码:
students = students.OrderByDescending(x => x.GetType().GetProperty(columnname).GetValue(x, null)).ToList();
我正在根据列名称执行排序功能。下降时有 24 列我正在根据下降的方向进行切换条件。
所以我指定了基于降序的切换条件用于升序,只有一个基于传入列的默认条件 name.i 不希望升序的条件。 我在这里尝试获取 属性 名称并默认按顺序传递,但它不起作用。
谁能提供更好的解决方案
public Static List<Students> Sort( string columnname , bool direction, List<Student> students){
Switch(columnname){
case "Name" when direction= false;
students.OrderByDescending(n=> n.Name)).ToListAsync();
break;
case "Marks" when direction= false;
students.OrderByDescending(n=> n.Marks).ToListAsync();
break;
etc 25 columns
default: // trying to pass a column name dynamically but the order is not working
var getPropertyName = nameof(columnname);
students.OrderBy(n=> getPropertyName).ToListAsync(); //
尝试使用传入的 属性 名称。
// Used reflection
var convertProperty = typeof(Student).GetProperty(columnname);
students.OrderByDescending(n=> convertProperty)).ToListAsync();
// 但无论我们执行什么订单,订单都不起作用
if try with a specific column name it is working
students.OrderBy(n=> n.Subjects)).ToListAsync();
students.OrderBy(n=> n.Marks)).ToListAsync();
}
return students
}
你的倒数第二个例子实际上非常接近应该起作用的东西。
忽略周围的一切,下面应该是上述示例的工作版本:
// Used reflection
var convertProperty = typeof(Student).GetProperty(columnname);
students.OrderByDescending(n => convertProperty.GetValue(n).ToString() ?? string.Empty).ToListAsync();
公平地说,我还没有尝试过这段代码,所以我可能在某处犯了错误,因为这是在没有 IDE 的情况下自由输入的,但它应该给出了一个大概的想法,对吧?
编辑
如果您使用的是 C# 6.0 及以上版本,您可以像上面提到的那样使用 null 检查,否则您也可以使用以下内容
students.OrderByDescending(n => (convertProperty.GetValue(n) ?? string.Empty).ToString()).ToListAsync();
您可以轻松使用此代码:
students = students.OrderByDescending(x => x.GetType().GetProperty(columnname).GetValue(x, null)).ToList();