निम्न तालिका संरचना के साथ (बाहरी हटाया कॉलम)को शामिल करें और कहाँ विधेय कारण में शामिल होने के बजाय आंतरिक
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%')
क्यों 3 क्वेरी में, यह एकउत्पन्न करता है Events
टेबल पर दूसरी बार 0? जबकि क्वेरी सही परिणाम उत्पन्न करती है, यह अजीब लगता है, क्यों EF/LINQ [Extent2]
SELECT
और WHERE
खंड में फिर से उपयोग नहीं कर सकता है, और यह LEFT OUTER JOIN
क्यों है?
मैं विजुअल स्टूडियो 2010 एसपी 1 .NET 4 का उपयोग कर रहा हूं और मैं एसक्यूएल सर्वर 2008 एक्सप्रेस से कनेक्ट कर रहा हूं।
दूसरी क्वेरी 'Include' का उपयोग करती है फिर भी बाएं शामिल नहीं होती है। – Matthew
बहुत अच्छा सवाल है, मैंने यह नहीं देखा। यह मेरे सामने वापस प्रतीत होता है। दूसरी क्वेरी में बाएं शामिल होना चाहिए ताकि इसमें साइड इफेक्ट्स न हो और तीसरी क्वेरी में आंतरिक शामिल होना चाहिए क्योंकि इसे किसी इवेंट पंक्ति की आवश्यकता है। – MikeKulls
एक बाएं जुड़ाव समझ में आता है अगर यह एक नामुमकिन कॉलम था, या अगर मेरे पास रेफरेंसियल अखंडता नहीं थी। – Matthew