Filer DataTable для исключения DBNull.Value - PullRequest
1 голос
/ 18 апреля 2009

Я получаю DataTable из файла Excel, и данные в первом столбце выглядят так:

11129

DBNull.Value

29299

29020

DBNull.Value

29020

Я использую LINQ для выбора distict, и он работает, если нет значений DBNull.Value, как показано ниже. albumIds = dt.AsEnumerable (). Select (p => (int) p.Field ("F1")). Distinct (). ToArray ();

Но если присутствует DBNull.Value, представляющие пустые ячейки Excel, я получаю ошибки преобразования.

Как отфильтровать эти DBNull.Value из моего набора результатов?

Спасибо

Ответы [ 5 ]

3 голосов
/ 18 апреля 2009

Как указывалось в ответе Джереми, если у вас есть ссылка на System.Data.DataSetExtensions.dll , вы получите несколько удобных методов расширения для работы с DataSets и DataTables с помощью LINQ. В частности, вы можете использовать метод Field <int?> (), чтобы преобразовать целочисленный столбец, который может содержать DBNull, в столбец значений NULL ...

albumIds = dt.AsEnumerable().Select(row => row.Field<int?>("F1"))
                            .Where(val => val.HasValue)
                            .Select(val => val.Value)
                            .Distinct()
                            .ToArray();
0 голосов
/ 18 апреля 2009

Можете ли вы попробовать это:

dt.AsEnumerable().Where(p => p.IsNull("F1") == false)
  .Select(p => p.Field<int>("F1")).Distinct().ToArray();

Я не могу проверить это, так как у меня нет этой настройки БД

0 голосов
/ 18 апреля 2009

Вам нужно проверить поля для DBNull, прежде чем пытаться выполнить преобразование с использованием метода Где, вероятно, проще всего.

dt.AsEnumerable().Where(p => p.Field("F1") != DBNull.Value).Select(p => (int)p.Field("F1")).Distinct().ToArray();
0 голосов
/ 18 апреля 2009

Я отвечу на свой вопрос.

Вместо использования Linq я делаю цикл foreach и удаляю строки, если значение равно нулю. а затем сделать Linq отличным

            foreach(DataRow row in dt.Rows)
            {
                if (String.IsNullOrEmpty(row["F1"].ToString()))
                    row.Delete();
            }

            dt.AcceptChanges();

            albumIds = dt.AsEnumerable().Select(p => (int)p.Field<double>("F1")).Distinct().ToArray();
0 голосов
/ 18 апреля 2009

Вам просто нужно сначала отфильтровать нулевые значения. Тогда ваше выражение LINQ должно отлично работать.

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