Динамически выбирать свойство в запросе Linq - PullRequest
2 голосов
/ 09 ноября 2011

Я столкнулся с одной проблемой с запросом linq в c #, мой запрос 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-запрос для выбора идентификатора и счетчика на основе переданного счетчика в параметре, например, если я передал counter1, он выберет только id, counter1 (переименованный в счетчик)

если я здесь воспользуюсь регистром коммутатора, то у него будет 20 конвертов, может кто-нибудь помочь мне, как можно динамически связать свойство в linq?

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 09 ноября 2011

Вы можете сделать свой класс 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 голосов
/ 09 ноября 2011

Думаю, вам стоит заглянуть в пространство имен System.Reflection. Конечно, вы хотите использовать его в запросе linq, но сейчас вы, похоже, не можете делать это динамически извлекать поле / свойство из класса.

Попробуйте использовать его вне запроса linq, и тогда вы найдете способ интегрировать его в свой запрос.

0 голосов
/ 09 ноября 2011

Вы также можете использовать Dynamic Linq . Суть в том, чтобы проанализировать вашу строку и преобразовать ее в деревья выражений. Смотрите здесь для более подробной информации

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...