【问题标题】:Dynamic Column Name in LinQLinQ 中的动态列名
【发布时间】:2014-09-04 03:28:20
【问题描述】:

我正在上课。

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

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

如何用 LinQ 做到这一点?

【问题讨论】:

    标签: linq list dynamic


    【解决方案1】:

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

    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&lt;object&gt;,因此您必须在之后对每个对象调用ToString() 以获取该值,或者在GetValue(x) 之后的查询中调用ToString()

    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");
    

    【讨论】:

    • items 应该是 List&lt;string&gt; 类型,不是吗?
    • 不,类是Item,所以它应该是该类型的列表。 namesdescriptions 将是 IEnumerable&lt;string&gt;
    • 是的,你是对的。不知道我在你的代码中解释了什么 - 抱歉
    • 这里你写了两个查询。用于检索名称,第二个用于描述。我需要一个通用的查询。
    • 如果列不存在,则会给出 NullReferenceException。如何处理这个异常?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 2010-10-07
    相关资源
    最近更新 更多