I am trying to figure out the LINQ
syntax for multiple left join, but I am getting the error: The name 'c' is not in scope on the left side of 'equals'. Consider swapping the expressions on either side of 'equals'.
I have already tried swapping, and if I do, it makes both 'c' and 'd' have the "not in scope" error.
var result =
from a in db.tableA
join b in db.tableB //first join (inner join)
on a.field1 equals b.field1
join c in db.tableC //second join (left join)
on a.field1 equals c.field1
into left_one
join d in db.tableD //third join (left join)
on c.field2 equals d.field2
// ^ here
into left_two
where a.field1 == theValueImSearchingFor
from c in left_one.DefaultIfEmpty()
from d in left_two.DefaultIfEmpty()
select new CombinedObject()
{
...
}
The reason I am using on c.field2 equals d.field2
in the third join statement is that my tables are structured like this:
tableA: field1
tableB: field1
tableC: field1 field2
tableD: field2
That is, the only way to relate tableD to the rest of the data is to use field2
.
Can someone please correct my syntax? Or is there a certain way I have to do it given my setup of tables?
Yes, indeed! You can use multiple LEFT JOINs in one query if needed for your analysis.
In LINQ, LEFT JOIN or LEFT OUTER JOIN is used to return all the records or elements from the left side collection and matching the elements from the right side of the collection. In LINQ, to achieve the LEFT Join behavior, it is mandatory to use the "INTO" keyword and "DefaultfEmpty()" method.
LEFT JOIN SyntaxON table1.column_name = table2.column_name; Note: In some databases LEFT JOIN is called LEFT OUTER JOIN.
You can use LINQ to perform a left outer join by calling the DefaultIfEmpty method on the results of a group join.
I use this type of syntax:
var results = (from a in db.tableA
from b in db.tableB.Where(s => s.field1 == a.field1)
from c in db.tableC.Where(s => s.field1 == a.field1).DefaultIfEmpty()
from d in db.tableD.Where(s => s.field2 == c.field2).DefaultIfEmpty()
select new CombinedObject() { });
It seems to work well on multiple tables. I think I got my field1s and field2s right to match your example :)
[Edit]
As per the comment, if you want to add in some additional filtering, you just add it in where appropriate into the Where()
. Eg:
from c in db.tableC.Where(s => s.field1 == a.field1 && s.field3 == someVariable).DefaultIfEmpty()
Something like that :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With