一尘不染

LINQ动态分组

c#

我有一个记录的类列表,因此用户可以选择按属性名称将行动态分组。例如MenuTextRoleNameActionName。然后,我必须执行分组,因此我需要一个通用的方法来通过传递列名来处理分组。

范例:

public class Menu
{
  public string MenuText {get;set;}
  public string RoleName {get;set;}
  public string ActionName {get;set;}
}

public class Menus 
{
 var list = new List<Menu>();
 list.Add( new Menu {MenuText="abc",RoleName ="Admin", ActionName="xyz"};
 list.Add( new Menu {MenuText="abc",RoleName ="Admin", ActionName="xyz"};
 list.Add( new Menu {MenuText="abc1",RoleName ="Admin1", ActionName="xyz1"};
 list.Add( new Menu {MenuText="abc1",RoleName ="Admin1", ActionName="xyz1"};

  /// columnName :- Name of the Menu class ( MenuText  or RoleName  or ActionName)

  public IEnumerable<IGrouping<string,IEnumerable<Menu>>> GroupMenu(string columnName)
  {
          // Here I want to get group the list of menu by the columnName 
  }
}

阅读 249

收藏
2020-05-19

共1个答案

一尘不染

如果您不使用数据库,则可以使用Reflection:

private static object GetPropertyValue(object obj, string propertyName)
{
    return obj.GetType().GetProperty(propertyName).GetValue(obj, null);
}

用作:

var grouped = enumeration.GroupBy(x => GetPropertyValue(x, columnName));

这是一个非常原始的解决方案,更好的方法应该是使用Dynamic
LINQ

var grouped = enumeration.GroupBy(columnName, selector);

编辑 动态 LINQ可能需要一些解释。它不是技术,库或全新的框架。它只是几个方便的(2000
LOC)帮助程序方法的名称,使您可以编写此类查询。只需下载它们的源代码(如果未安装VS示例),然后在代码中使用它们即可。

2020-05-19