2015-01-08 3 views
2

Я хочу написать один запрос LINQ с левым внешним соединением. Для этого я могу написать соответствующий запрос SQL, который возвращает желаемый результат, но то же самое в linq не работает для меня.Использование Left Outer Присоединиться к Linq

Это то, что мой SQL выглядит следующим образом:

SELECT Table1.ID, Table1.Description 
    FROM Table1 LEFT OUTER JOIN 
    Table2 ON Table1.AID = Table2.AID AND Table1.TID = Table2.TID 
    WHERE (Table2.Status <> 'Using') OR (Table.Status IS NULL) 

Этот запрос возвращает 7 записей для меня и это то, что мое требование is.Now тот же запрос, я хочу писать с помощью LINQ и это то, что я пытался с :

return (from t1 in db.Table1.AsEnumerable() 
    join t2 in db.Table2.AsEnumerable() on t1.AID equals t2.AID into outer 
    from item in outer.DefaultIfEmpty() 
    where item.TID == t1.TID 
    && string.IsNullOrEmpty(item.Status) || item.Status != "Using" 
    select t1 
    ); 

Но я столкнулся с проблемами с this.Here, он не в состоянии найти пункт и, таким образом, возвращая

'Object reference not set to an instance of an object.' 

Что я делаю неправильно здесь ????

Я старался постоянно, но не имел решений. Таким образом, любая помощь в этом была бы высоко оценена. Спасибо заранее.

+0

[Что такое NullReferenceException и как это исправить?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) –

+0

Почему у вас есть этот 'AsEnumerable()'? Вы должны убрать его. (дважды) –

ответ

3

Ваши инструкции SQL и LINQ не совпадают, у вас есть другой пункт join. Попробуйте это:

from t1 in db.Table1 
    join t2 in db.Table2 on new { 
           aID = t1.AID, 
           tID = t2.TID 
           } 
         equals new { 
           aID = t2.AID, 
           tID = t2.TID 
           } into outer 
    from item in outer.DefaultIfEmpty() 
    where item.Status == null || item.Status != "Using" 
    select t1 

Вы можете добавить присоединиться отношения Медленно Много с new {} equals new {} заявление.

+0

Пробовал это, но снова получил ту же ошибку в разделе 'item.Status'. Пока отладка показывает значение как null для этого поля. Можете, пожалуйста, проверить. – Saroj

+0

Спасибо за вашу помощь. Он работал после удаления AsEnumerable с тем же условием. – Saroj

1

DefaultIfEmpty возвращает коллекцию, содержащую единый элемент по умолчанию, если в коллекции нет ничего.

Как ваши лица, вероятно, классы, а не структуры, это означает, что вы получите коллекцию в нем одного null, не коллекции с одним пунктом в нем с нулевыми полями.

А также присоединиться к изменению дизъюнкции suggested by Loetn, вы должны также изменить where условия

where item == null || item.Status != "Using" 
+0

Спасибо за вашу помощь. Он работал после удаления AsEnumerable с тем же условием. – Saroj

+0

@Saroj Это потому, что с помощью 'AsEnumerable' вы используете LINQ-to-Objects, где чтение свойства нулевой ссылки приведет к возникновению исключения, а без' AsEnumerable' вы используете LINQ-to-SQL, и SQL все равно. – Rawling

Смежные вопросы