2011-11-09 67 views
2

動態選擇屬性,我面臨着LINQ查詢一個問題,在C#中,我的LINQ查詢按照以下在Linq查詢

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

          }).ToList(); 

我有一個性能監視器類,它包含了像(ID,C1的特性, counter2 ...) 有超過20個計數器現在我已經開發了sql查詢來選擇ID和計數器根據參數傳遞countername eg如果我已經通過counter1然後它會選擇id,counter1(只更名爲計數器)

如果我將在這裏使用開關的情況下,那麼它將有20個女巫的情況下,任何人都可以請幫助我如何可以綁定動態linq屬性?

在此先感謝。

回答

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(); 
+0

喜歡執行。畢竟,這些屬性是關鍵值對。爲它+1。 – Anand

+0

你可以解決以下問題的錯誤? http://stackoverflow.com/questions/11096029/i-need-to-select-particular-column-based-on-check-box-list-in-linq-c-net#comment14559726_11096029 – Thulasiram

0

我想你應該看看System.Reflection命名空間。當然,你想在linq查詢中使用它,但是現在你似乎無法做的事情是動態地從類中提取字段/屬性。

試着在linq查詢之外使用它,然後你會找到一種方法將它集成到你的查詢中。

+0

這是一個有效的解決方案,但如果你不介意改變Perfmon課程,我建議你去@Polity的答案。我認爲它更乾淨,而且很可能會更具性能。 – Tipx