Проблема LINQ to Dataset DBNULL/исключение нулевой ссылки

У меня есть следующий запрос LINQ, который всегда приводит к ошибке, когда мой столбец «Примечание» в dtblDetail имеет значение null, даже если я проверяю, является ли он NULL.

var varActiveAndUsedElementsWithDetails =
                        from e in dtblElements
                        join d in dtblDetails on e.PK equals d.FK into set
                        from d in set.DefaultIfEmpty()
                        where (e.ElementActive == true)
                        select new
                        {
                            ElementPK = e.PK,
                            Remark = d.IsRemarkNull() ? null : d.Remark
                        };

Сообщение об ошибке: «Значение столбца «Примечание» в таблице «dtblDetails» равно DBNull». После добавления теста для d.IsRemarkNull() возникает исключение нулевой ссылки.

Можете ли вы помочь мне с этим?

Я уже проверил следующие веб-сайты, но не нашел ничего полезного, кроме того, что мне нужно проверить на DBNULL. Но, как сказано, это не решает мою проблему.


person Marc    schedule 19.05.2009    source источник


Ответы (3)


Проблема заключалась в том, что весь элемент «d» был пуст. Таким образом, вызов 'd.IsRemarkNull()' привел к исключению нулевой ссылки. Следующий код устранил проблему:

var varActiveAndUsedElementsWithDetails =
                    from e in dtblElements
                    join d in dtblDetails on e.PK equals d.FK into set
                    from d in set.DefaultIfEmpty()
                    where (e.ElementActive == true)
                    select new
                    {
                        ElementPK = e.PK,
                        Remark = d == null? null : (d.IsRemarkNull() ? null : d.Remark)
                    };
person Marc    schedule 25.05.2009

Откуда ошибка? Возможно ли, что это вызывает d.IsRemarkNull()? Как выглядит этот метод?

Возможно:

DBNull.Value.Equals(d.Remark)
person dmo    schedule 19.05.2009
comment
Ошибка возникает, как только я получаю первое значение, содержащее DBNull. Таким образом, varActiveAndUsedElementsWithDetails.First() может его создать. Метод d.IsRemarkNull() автоматически создается для набора данных и вызывает метод System.Data.DataRow.IsNull(): return this.IsNull(this.tableDetails.RemarkColumn); - person Marc; 19.05.2009
comment
Я еще не использовал linq с SQL, но разве null и DBNull не обрабатываются отдельно? Вы пытались добавить предложение where для явной фильтрации строк, где !DBNull.Value.Equals(d.Remark)? - person dmo; 19.05.2009
comment
Да, они рассматриваются отдельно, поэтому вы не можете проверить d.Remark == null. Однако сгенерированный метод.IsRemarkNull() должен точно обрабатывать эту ситуацию, но здесь он, похоже, не работает... - person Marc; 19.05.2009
comment
Я обнаружил, что проблема была на самом деле в исключении нулевой ссылки, потому что 'd' было нулевым. Таким образом, вызов d.IsRemarkNull() привел к исключению нулевой ссылки. В любом случае, большое спасибо за вашу помощь. - person Marc; 25.05.2009

возможно, это поле не допускает null в db, получает для него значение по умолчанию и избегает обработки нулевых значений

person Ada    schedule 19.05.2009
comment
Спасибо за подсказку, но поле допускает NULL в БД. Также типизированное поле данных допускает NULL. Вот почему у него есть этот автоматически сгенерированный метод d.IsRemarkNull(), кстати. - person Marc; 19.05.2009