Левое внешнее соединение с использованием LINQ - дает разные результаты

Я пытаюсь написать левое внешнее соединение с помощью LINQ. SQL выглядит так:

SELECT  *                 
FROM Table1 td1
LEFT OUTER JOIN Table2
ON td1.ColumnName = td2.ColumnName
WHERE td2.ColumnName IS NULL                  
ORDER BY SomeColumns

Если я запустил этот запрос в анализаторе SQL Query, он вернет, скажем, 100 записей. И мой преобразованный код LINQ возвращает 105 записей. Я написал LINQ двумя способами:

Способ 1:

var data= (from td1in Table1
           join td2 in Table2.Where(a => a.ColumnName == (int?)null)
           on td1.ColumnName equals td2.ColumnName into outer
           from x in outer.DefaultIfEmpty()
           orderby SomeColumns
           select td1);

Метод 2: возникает исключение, так как не удалось перечислить результаты

var data = from td1 in Table1
           join td2 in Table2
           on td1.ColumnName equals td2.ColumnName into outer
           from item in outer.DefaultIfEmpty()
           where item.ColumnName.Value == (int?)null
           orderby somecolumns
           select td1 ;

Столбец, используемый в предложении where, имеет тип int, допускающий значение NULL.

Результат, возвращаемый анализатором SQL, кажется правильным. Пожалуйста, помогите мне получить идентичные результаты.

Спасибо


person Vijay Balkawade    schedule 10.07.2013    source источник


Ответы (1)


Попробуйте этот запрос:

var data = from td1 in Table1
           join td2 in Table2
           on td1.ColumnName equals td2.ColumnName into outer
           from item in outer.DefaultIfEmpty()
           where item == null
           orderby somecolumns
           select td1 ;

В исходном запросе эта строка item.ColumnName.Value == (int?)null была неправильной, потому что вы пытались получить значение для всех ColumnName, даже если item был нулевым. Я поправил и теперь все должно работать нормально.

person gzaxx    schedule 10.07.2013
comment
он генерирует исключение, поскольку 'data.ToList ()' сгенерировал исключение типа 'System.NullReferenceException' System.Collections.Generic.List ‹Table1› {System.NullReferenceException} - person Vijay Balkawade; 10.07.2013
comment
Моя ошибка исправлена, попробуйте еще раз :) - person gzaxx; 10.07.2013