3

Possible Duplicate:
EF4.2 extra left outer join to same table

I have three entities in a Parent -> Child -> Grandchild relationship: Order -> OrderCustomer -> OrderItem

Each child entity has a non-nullable FK to its parent (i.e. OrderItem.OrderCustomerID and OrderCustomer.OrderID). And I want to query all OrderItems (grandchildren) for a group of Orders. In SQL I would write:

select
    oc.OrderID,
    oi.Quantity,
    oi.SKU
from OrderItems oi
    join OrderCustomers oc on oi.OrderCustomerID = oc.OrderCustomerID
where
    oc.OrderID in (1, 2, 3, 4, 5)

...so this is what I wrote in LINQ...

OrderItems
    .Where(oi => new[] { 1, 2, 3, 4, 5 }.Contains(oi.OrderCustomer.OrderID))
    .Select(oi => new
    {
        oi.OrderCustomer.OrderID,
        oi.Quantity,
        oi.SKU
    })

...but this is the SQL generated by EF...

SELECT 
    [Extent1].[OrderCustomerID] AS [OrderCustomerID], 
    [Extent3].[OrderID] AS [OrderID], 
    [Extent1].[Quantity] AS [Quantity], 
    [Extent1].[SKU] AS [SKU]
FROM [dbo].[OrderItems] AS [Extent1]
    INNER JOIN [dbo].[OrderCustomers] AS [Extent2] ON [Extent1].[OrderCustomerID] = [Extent2].[OrderCustomerID]
    LEFT OUTER JOIN [dbo].[OrderCustomers] AS [Extent3] ON [Extent1].[OrderCustomerID] = [Extent3].[OrderCustomerID]
WHERE
    [Extent2].[OrderID] = 1 OR [Extent3].[OrderID] IN (2,3,4,5)

Why both an INNER JOIN and an OUTER JOIN?

And why split up the WHERE clause?

On a database with millions of records this query is horribly slow.

But wait, if I change the LINQ to do the Select before the Where...

OrderItems
    .Select(oi => new
    {
        oi.OrderCustomer.OrderID,
        oi.Quantity,
        oi.SKU
    })
    .Where(x => new[] { 1, 2, 3, 4, 5 }.Contains(x.OrderID))

...I get the SQL I wanted...

SELECT 
    [Extent1].[OrderCustomerID] AS [OrderCustomerID], 
    [Extent2].[OrderID] AS [OrderID], 
    [Extent1].[Quantity] AS [Quantity], 
    [Extent1].[SKU] AS [SKU]
FROM [dbo].[OrderItems] AS [Extent1]
    INNER JOIN [dbo].[OrderCustomers] AS [Extent2] ON [Extent1].[OrderCustomerID] = [Extent2].[OrderCustomerID]
WHERE
    [Extent2].[OrderID] IN (1,2,3,4,5)

So, I guess I can help EF by doing the LINQ Select first, but does anyone know what is up with the first query?

Community
  • 1
  • 1
  • 2
    Looks like the same question was asked here http://stackoverflow.com/q/8717364/718642 Should be fixed in the next .NET/EF release. –  Mar 21 '12 at 05:45

0 Answers0