Используя технику, найденную в статье MSDN "How to: Perform Left Outer Joins (C# Programming Guide)", я попытался создать левое внешнее соединение в моем коде Linq. В статье упоминается использование метода DefaultIfEmpty
для создания левого внешнего соединения из группового соединения. В принципе, он инструктирует программу включать результаты левой (первой) коллекции, даже если в правой коллекции нет результатов.Linq left external join not working
Способ выполнения этой программы, однако, он делает это так, как если бы внешнее соединение не было указано.
В нашей базе данных AgentProductTraining
представляет собой набор курсов, которые наши агенты взяли. Обычно вы не можете ввести Course
в соответствующую таблицу без ввода соответствующего значения в таблицу CourseMaterials
. Однако иногда это может произойти, поэтому мы хотим убедиться, что мы возвращаем результаты, даже если Course
указан в AgentProductTraining
без соответствующей информации в CourseMaterials
.
var training = from a in db.AgentProductTraining
join m in db.CourseMaterials on a.CourseCode equals m.CourseCode into apm
where
a.SymNumber == id
from m in apm.DefaultIfEmpty()
where m.EffectiveDate <= a.DateTaken
&& ((m.TerminationDate > a.DateTaken) | (m.TerminationDate == null))
select new
{
a.AgentProdTrainId,
a.CourseCode,
a.Course.CourseDescription,
a.Course.Partner,
a.DateTaken,
a.DateExpired,
a.LastChangeOperator,
a.LastChangeDate,
a.ProductCode,
a.Product.ProductDescription,
m.MaterialId,
m.Description,
a.Method
};
Есть навигационное свойство 'AgentProductTraining.CourseMaterials'? –
Кроме того, название говорит, что внутреннее соединение lleft не работает, но я предполагаю, что это внешнее соединение? На самом деле, на вашем посту не существует проблемы. –
Хороший улов, спасибо. Я не верю, что у нас есть свойство навигации на 'CourseMaterials' – NealR