在Linq查询中动态选择属性

时间:2011-11-09 04:58:58

标签: c# sql linq

我在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和counter。如果我已经通过了counter1,那么它将只选择id,counter1(重命名为counter)

如果我在这里使用switch case那么它将有20个女巫案例,有谁可以帮助我如何在linq中动态绑定属性?

提前致谢。

3 个答案:

答案 0 :(得分:2)

您可以使字典支持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();

答案 1 :(得分:0)

您还可以使用动态Linq 。本质是解析您的字符串并将其转换为表达式树。有关详细信息,请参阅此处

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

答案 2 :(得分:0)

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

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