쿼리 식의 Null 값 처리

이 예제에서는 소스 컬렉션에서 가능한 null 값을 처리하는 방법을 보여 줍니다. IEnumerable<T> 등의 개체 컬렉션에는 값이 null인 요소가 포함될 수 있습니다. 소스 컬렉션이 null이거나 값이 null인 요소를 포함하고 사용 중인 쿼리가 null 값을 처리하지 않는 경우 쿼리를 실행하면 NullReferenceException이 throw됩니다.

다음 예제와 같이 null 참조 예외를 피하도록 방어적으로 코딩할 수 있습니다.

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

이전 예제에서 where 절은 범주 시퀀스에서 모든 null 요소를 필터링합니다. 이 방법은 join 절의 null 확인과 관계가 없습니다. Products.CategoryIDNullable<int>의 축약형인 int? 형식이므로 이 예제에서는 null이 있는 조건식이 적용됩니다.

join 절에서 비교 키 중 하나만 null 허용 값 형식인 경우에는 쿼리 식에서 다른 키를 null 허용 형식으로 캐스팅할 수 있습니다. 다음 예제에서는 EmployeeIDint? 형식의 값이 포함된 열이라고 가정합니다.

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 };
}

각 예제에서 equals 쿼리 키워드를 사용합니다. 패턴 일치를 사용할 수도 있습니다. 여기에는 패턴에 대한 패턴과 is not null에 대한 is null 패턴이 포함됩니다. 쿼리 공급자가 새 C# 구문을 올바르게 해석하지 못할 수 있으므로 LINQ 쿼리에서는 이러한 패턴을 사용하지 않는 것이 좋습니다. 쿼리 공급자는 C# 쿼리 식을 Entity Framework Core와 같은 네이티브 데이터 형식으로 변환하는 라이브러리입니다. 쿼리 공급자는 System.Linq.IQueryProvider 인터페이스를 구현하여 System.Linq.IQueryable<T> 인터페이스를 구현하는 데이터 소스를 만듭니다.

참고 항목