【问题标题】:Dynamically select property in Linq query在 Linq 查询中动态选择属性
【发布时间】:2011-11-09 04:58:57
【问题描述】:

我在 c# 中遇到一个 linq 查询问题,我的 linq 查询如下

list = (from row in dt.AsEnumerable()
                            select new Perfmon
                            {
                                id = row.Field<long>("id"),
                                counter1 = row.Field<string>("counter"),

                            }).ToList();

我有一个 perfmon 类,它包含 (id, counter1, counter2 ...) 现在有 20 多个计数器我已经开发了 sql 查询来根据参数中传递的计数器名称选择 id 和计数器,例如如果我通过了 counter1 那么它只会选择 id , counter1 (重命名为 counter)

如果我在这里使用 switch case,那么它将有 20 个 wwitch case,谁能帮助我如何在 linq 中动态绑定属性?

提前致谢。

【问题讨论】:

    标签: c# sql linq


    【解决方案1】:

    您可以使您的 Perfmon 类由字典支持,而不是每个属性的字段。喜欢:

    class Perfmon
    {
        private readonly Dictionary<string, string> _counters = new Dictionary<string, string>();
    
        public Perfmon(params KeyValuePair<string, string>[] knownCounters)
        {
            foreach (var knownCounter in knownCounters)
            {
                SetCounter(knownCounter.Key, knownCounter.Value);
            }
        }   
        public void SetCounter(string name, string value)
        {
            _counters[name] = value;
        }
    
        protected string GetCounterValue(string name)
        {
            if (_counters.ContainsKey(name))
                return _counters[name];
            else
                return null;
        }
    
        public string Counter1 { get { return GetCounterValue("Counter1"); } }
        public string Counter2 { get { return GetCounterValue("Counter2"); } }
        public string Counter3 { get { return GetCounterValue("Counter3"); } }
    }
    

    构造函数在那里,因此您可以在查询中轻松使用它,例如:

    var counterName = "Counter2";
    list = (from row in dt.AsEnumerable() 
                                select new Perfmon(new KeyValuePair<string, string>(counterName, row.Field<string>("counter")))
                                { 
                                    id = row.Field<long>("id")
                                }).ToList();
    

    【讨论】:

    【解决方案2】:

    您也可以使用 Dynamic Linq。本质是解析您的字符串并将其转换为表达式树。更多详情请看这里

    http://weblogs.asp.net/rajbk/archive/2007/09/18/dynamic-string-based-queries-in-linq.aspx

    【讨论】:

      【解决方案3】:

      我认为您应该查看System.Reflection 命名空间。当然,您想在 linq 查询中使用它,但目前您似乎无法从类中动态提取字段/属性。

      尝试在 linq 查询之外使用它,然后您会找到一种方法将其集成到您的查询中。

      【讨论】:

      • 这是一个有效的解决方案,恕我直言,但如果您不介意更改 Perfmon 类,我建议您使用@Polity 的答案。我认为它更干净,并且很可能会更高效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多