Как отсортировать DataTable по 2 столбцам, с NULL, возможно, используя LINQ? - PullRequest
1 голос
/ 30 октября 2009

У меня есть таблица данных ADO.Net, которую мне нужно отсортировать сначала по столбцу 1, а затем по столбцу 2, любой из которых может иметь значения NULL. После сортировки мне нужно прочитать некоторые значения из строк и добавить в просмотр списка.

Я написал код для этого DataTable.DefaultView.Sort (запускается дважды). Но интересно, может ли быть лучший способ.

Я думал, может быть, LINQ ... поэтому я попытался:

OrderedEnumerableRowCollection<DataRow> queryX = dt.AsEnumerable()
            .OrderBy(c => c.Field<int?>("column1"))
            .ThenBy(c => c.Field<int?>("column2"));

Но это ошибки с "System.InvalidCastException was unhandled". Я предположил, что это вызвано значениями NULL, поэтому в качестве теста я указал запрос к таблице данных "where column1 IS NOT NULL", и ошибка все еще происходит.

У меня не так много опыта LINQ, поэтому мои вопросы:

  • Что не так с моим кодом выше? Концептуально я что-то упускаю из-за того, как работает LINQ?
  • Почему фильтрация нулей по-прежнему вызывает это? Опять же, концептуально я что-то упускаю из-за того, как работает LINQ
  • Есть ли лучший \ правильный запрос LINQ для этого?
  • Есть ли лучший \ правильный (более элегантный) способ сделать это (с использованием LINQ или нет)?

теп

Ответы [ 2 ]

10 голосов
/ 30 октября 2009

Если у вас есть DataTable, взгляните на DataView :

private void SortByTwoColumns()
{
    // Get the DefaultViewManager of a DataTable.
    DataView view = DataTable1.DefaultView;

    // By default, the first column sorted ascending.
    view.Sort = "State, ZipCode DESC";
}

Источник: http://msdn.microsoft.com/en-us/library/system.data.dataview.sort.aspx

0 голосов
/ 02 ноября 2009

Not sure what the datatypes are for those columns, I'm assuming they are int
but if your database is Oracle, try the following:

OrderedEnumerableRowCollection queryX = dt.AsEnumerable()
            .OrderBy(c => c.Field("column1"))
            .ThenBy(c => c.Field("column2"));

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