In the following table structure (extraneous columns removed)
create table [Events] ( ID int not null identity, Name nvarchar(128) not null, constraint PK_Events primary key(ID) ) create table [Donations] ( ID int not null identity, EventID int not null, Amount decimal(10, 2) not null, constraint PK_Donations primary key(ID), constraint FK_Donations_Events foreign key(EventID) references [Events](ID) on update no action on delete no action )
I use the following Linq-to-Entities queries:
// 1 ents.Donations.Where(d => d.Amount > 25.0m && d.Event.Name.Contains("Run")).ToList(); // 2 ents.Donations.Include("Event").Where(d => d.Amount > 25.0m).ToList(); // 3 ents.Donations.Include("Event").Where(d => d.Amount > 25.0m && d.Event.Name.Contains("Run")).ToList();
Produces (from SQL Profiler):
-- 1 SELECT [Extent1].[ID] AS [ID], [Extent1].[EventID] AS [EventID], [Extent1].[Amount] AS [Amount] FROM [dbo].[Donations] AS [Extent1] INNER JOIN [dbo].[Events] AS [Extent2] ON [Extent1].[EventID] = [Extent2].[ID] WHERE ([Extent1].[Amount] > 25.0) AND ([Extent2].[Name] LIKE N'%Run%') -- 2 SELECT [Extent1].[ID] AS [ID], [Extent1].[EventID] AS [EventID], [Extent1].[Amount] AS [Amount], [Extent2].[ID] AS [ID1], [Extent2].[Name] AS [Name] FROM [dbo].[Donations] AS [Extent1] INNER JOIN [dbo].[Events] AS [Extent2] ON [Extent1].[EventID] = [Extent2].[ID] WHERE [Extent1].[Amount] > 25.0 -- 3 SELECT [Extent1].[ID] AS [ID], [Extent1].[EventID] AS [EventID], [Extent1].[Amount] AS [Amount], [Extent3].[ID] AS [ID1], [Extent3].[Name] AS [Name] FROM [dbo].[Donations] AS [Extent1] INNER JOIN [dbo].[Events] AS [Extent2] ON [Extent1].[EventID] = [Extent2].[ID] LEFT OUTER JOIN [dbo].[Events] AS [Extent3] ON [Extent1].[EventID] = [Extent3].[ID] WHERE ([Extent1].[Amount] > 25.0) AND ([Extent2].[Name] LIKE N'%Run%')
Why in the third query does it generate a LEFT OUTER JOIN in the Events table a second time? Although the query gives the correct results, it seems strange why EF / LINQ cannot use [Extent2] in the SELECT and WHERE , and why is it a LEFT OUTER JOIN ?
I am using Visual Studio 2010 sp1.NET 4 and I am connecting to Sql Server 2008 Express.
c # linq linq-to-entities entity-framework
Matthew
source share