Поделиться через


Практическое руководство. Обработка значений NULL в выражениях запросов (Руководство по программированию в C#)

Обновлен: Ноябрь 2007

В этом примере показана обработка значений NULL, которые могут встретиться в исходной коллекции. Коллекция объектов, например IEnumerable<T>, может содержать элементы, значение которых равно NULL. Если исходная коллекция равняется NULL или содержит элемент, значение которого равно NULL, а запрос не обрабатывает значения NULL, то при выполнении запроса возникнет исключение NullReferenceException.

Пример

В код можно включить механизм защиты, позволяющий избежать появления ссылок на значения NULL, как показано в следующем примере.

var query1 =
    from c in categories
    where c != null
    join p in products on c.ID equals
        (p == null ? null : p.CategoryID)
    select new { Category = c.Name, Name = p.Name };

В приведенном выше примере предложение where позволяет отфильтровать все элементы NULL в последовательности категорий. Такой подход не зависит от проверки на значения NULL в предложении join. Условное выражение в этом примере работает потому, что значение Products.CategoryID имеет тип int? что является сокращенной записью для Nullable<int>.

Если в предложении join только один из ключей сравнения имеет тип значения, допускающий значения NULL, можно привести второй ключ в выражении запроса к типу, допускающему значение NULL. В следующем примере предполагается, что EmployeeID — столбец значений типа int?:

void TestMethod(Northwind db)
{
    var query =
        from o in db.Orders
        join e in db.Employees
            on o.EmployeeID equals (int?)e.EmployeeID
        select new { o.OrderID, e.FirstName };
}

См. также

Задачи

Пример запроса LINQ к базе данных "Борей"

Основные понятия

Выражения запросов LINQ (Руководство по программированию в C#)

Ссылки

Типы, допускающие значения NULL (руководство по программированию на C#)

Nullable<T>