用下面的表結構(刪除多餘的欄)包括和Where謂詞事業左連接,而不是內部聯接
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
)
我用下面的LINQ到實體查詢:
// 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();
主要生產(從SQL事件探查器):
-- 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%')
爲什麼在第三查詢,它生成一個第二次在Events
表上顯示0?雖然查詢產生正確的結果,但它似乎很奇怪,爲什麼EF/LINQ爲什麼不能在SELECT
和WHERE
子句中重複使用[Extent2]
,爲什麼它是LEFT OUTER JOIN
?
我正在使用Visual Studio 2010 sp1 .NET 4,並且正在連接到Sql Server 2008 Express。
第二個查詢使用'Include',但不會產生左連接。 – Matthew 2012-07-23 04:53:37
非常好的問題,我沒有注意到。這似乎對我來說很重要。第二個查詢應該有一個左連接,以便Include不會導致副作用,第三個查詢應該有內連接,因爲它無論如何都需要一個事件行。 – MikeKulls 2012-07-23 05:56:02
如果左連接是可爲空的列,或者如果我沒有參照完整性,則左連接將有意義。 – Matthew 2012-07-23 14:38:15