LinQ中的动态列名称

时间:2014-07-14 08:49:39

标签: linq list dynamic

我正在上课。

class Item{
        public int Id { get; set; }
        public DateTime CreatedDate { get; set; } 
        public string Name { get; set; }
        public string Description { get; set;}
    }

我想根据动态列名过滤项目列表。 假设我想要名称列表,那么列名称是“名称”,结果将是名称列表 如果列名是Description,我需要描述列表。

如何使用LinQ执行此操作?

1 个答案:

答案 0 :(得分:13)

简单,只需从列表中选择您需要的属性:

var items = new List<Item>();
//get names
var names = items.Select(x => x.Name);
//get descriptions
var descriptions = items.Select(x => x.Description);

<强>更新

你需要做一些反思才能做到这一点:

var names = items.Select(x => x.GetType().GetProperty("Name").GetValue(x));

将其放入可重用性的方法中:

public IEnumerable<object> GetColumn(List<Item> items, string columnName)
{
    var values = items.Select(x => x.GetType().GetProperty(columnName).GetValue(x));
    return values;
}

当然,这不会验证对象中是否存在列。所以当它没有时会抛出NullReferenceException。它返回IEnumerable<object>,因此您必须在每个对象上调用ToString()以获取值,或者在ToString()之后立即调用GetValue(x)

public IEnumerable<string> GetColumn(List<Item> items, string columnName)
{
    var values = items.Select(x => x.GetType().GetProperty(columnName).GetValue(x).ToString());
    return values;
}

用法:

var items = new List<Item>(); //fill it up
var result = GetColumn(items, "Name");