Linq to DataTable - Невозможно привести DBNull - PullRequest
2 голосов
/ 17 августа 2011

Новичок в Linq, поэтому извиняюсь, если это основной. Этот запрос выдает ошибку {"Невозможно привести DBNull.Value к типу 'System.Int64'. Пожалуйста, используйте обнуляемый тип."}, Когда я перечисляю результаты.

    private void AddLevels(long rootid)
    {
        var results = from row in data.AsEnumerable()
                      where row.Field<long>("ParentID") == rootid
                      select row;

        foreach (DataRow row in results)
        {
            //do stuff
        }

    }

Столбец ParentID принимает пустые значения - нужно ли обрабатывать их отдельно?

EDIT2: Фактическое решение ниже, которое по-прежнему использует Linq.

РЕДАКТИРОВАТЬ: Я решил эту проблему, отказавшись от Linq и просто вместо этого использовать оператор DataTable.Select. Если бы кто-то получил информацию о разнице в производительности, мне было бы интересно.

Ответы [ 2 ]

13 голосов
/ 17 августа 2011

Используйте эту строку в вашем запросе:

where row.Field<decimal?>("ParentID") == rootid

decimal? является синтаксическим сахаром для System.Nullable<decimal>, который по существу такой же, как decimal, за исключением того, что он также допускает значения null.

long - это совсем другой тип - он может представлять только целые числа, а не десятичные значения, поэтому возникает ошибка «Указанное приведение неверно».

0 голосов
/ 17 августа 2011

длинный корень обнуляемый тип? Только тогда он может принимать нули

...