Использование LINQ для получения значения столбца из имени столбца, когда у вас есть строка? - PullRequest
0 голосов
/ 20 ноября 2008

Я пытаюсь преобразовать некоторый код, который использует наборы данных, в LINQ. Часть кода передает имена столбцов в другие функции как строки.

В любом случае, я могу легко переписать это в LINQ?

string s = getElement(tr, elementName);

private string getElement (tableRow re, string elementName){
    if(tr[elementName] != null){
       return tr[elementName].toString()
    }
}

ИЛИ:

private void copy (tableRow trFrom, tableRow trTo){
   foreach (DataColumn c in trFrom.Table.Columns) {
        trTo[c.ColumnName] = trFrom[c.ColumnName];
   }
}

Ответ ГВС: Причина преобразования в LINQ заключается в том, что во многих ситуациях проще кодировать LINQ и получить лучшую производительность. Это связано с другим вопросом здесь на stackoverflow: шаблон программирования с использованием типизированных наборов данных

Причина, по которой мне нужно использовать имя столбца в качестве строки, заключается в основном потому, что имена столбцов передаются в качестве идентификатора для полей ввода, а затем отправляются обратно в программу с помощью AJAX (jquery).

Ответы [ 3 ]

2 голосов
/ 20 ноября 2008
  1. Простой способ

    1,1. Использование IEnumerable (Linq to Objects или подобное) Измените параметр elementName для Func и передайте вместо него лямбда-выражения (вы также получите проверку времени компиляции!)

    1.2. Использование IQueryable (Linq to SQL или аналогичный) То же самое, но вместо этого используйте Expression>.

  2. Сложный путь: Если по какой-то причине вам нужно сохранить параметр в виде строки (возможно, введенной пользователем), вы можете использовать отражение для построения дерева выражений во время выполнения http://msdn.microsoft.com/en-us/library/system.linq.expressions.expression.aspx.

    2,1. Использование IEnumerable Затем скомпилируйте и используйте его в качестве параметра где, выберите ...

    2,2. Использование IQueryable Используйте его в качестве параметра в поле where, выберите

Если вам нужно составить лямбду с другими лямбдами, используйте эту классную технику http://tomasp.net/blog/linq-expand.aspx

1 голос
/ 27 апреля 2009

Ответ заключается в использовании отражения.

Получение значения

private string getElement (tableRow tr, string element){
    string val = "";
    try
    {
        val = tr.GetType().GetProperty(element).GetValue(tr, null).ToString();
    }
    catch //NULL value
    {
        val = "";
    }
}

Или сценарий копирования:

foreach (PropertyInfo c in tr.GetType().GetProperties())
{
    thr.GetType().GetProperty(c.Name).SetValue(thr,
         tr.GetType().GetProperty(c.Name).GetValue(tr, null), null);
}
0 голосов
/ 20 ноября 2008

Зачем вам преобразовывать работающий и понятный код во что-то, используя LINQ?

Редактировать: LINQ хороший, классный материал. Но не делайте те же ошибки, что и многие поклонники XML (особенно первые адаптеры), применяя его ко всему.

...