Can I force the auto-generated Linq-to-SQL classes to use an OUTER JOIN?
Posted
by Gary McGill
on Stack Overflow
See other posts from Stack Overflow
or by Gary McGill
Published on 2010-03-14T22:01:29Z
Indexed on
2010/03/14
22:05 UTC
Read the original article
Hit count: 252
linq-to-sql
Let's say I have an Order
table which has a FirstSalesPersonId
field and a SecondSalesPersonId
field. Both of these are foreign keys that reference the SalesPerson
table. For any given order, either one or two salespersons may be credited with the order. In other words, FirstSalesPersonId
can never be NULL
, but SecondSalesPersonId
can be NULL
.
When I drop my Order
and SalesPerson
tables onto the "Linq to SQL Classes" design surface, the class builder spots the two FK relationships from the Order
table to the SalesPerson
table, and so the generated Order
class has a SalesPerson
field and a SalesPerson1
field (which I can rename to SalesPerson1
and SalesPerson2
to avoid confusion).
Because I always want to have the salesperson data available whenever I process an order, I am using DataLoadOptions.LoadWith
to specify that the two salesperson fields are populated when the order instance is populated, as follows:
dataLoadOptions.LoadWith<Order>(o => o.SalesPerson1);
dataLoadOptions.LoadWith<Order>(o => o.SalesPerson2);
The problem I'm having is that Linq to SQL is using something like the following SQL to load an order:
SELECT ...
FROM Order O
INNER JOIN SalesPerson SP1 ON SP1.salesPersonId = O.firstSalesPersonId
INNER JOIN SalesPerson SP2 ON SP2.salesPersonId = O.secondSalesPersonId
This would make sense if there were always two salesperson records, but because there is sometimes no second salesperson (secondSalesPersonId
is NULL
), the INNER JOIN
causes the query to return no records in that case.
What I effectively want here is to change the second INNER JOIN
into a LEFT OUTER JOIN
. Is there a way to do that through the UI for the class generator? If not, how else can I achieve this?
(Note that because I'm using the generated classes almost exclusively, I'd rather not have something tacked on the side for this one case if I can avoid it).
© Stack Overflow or respective owner