La query Linq semplice ha un join duplicato rispetto alla stessa tabella?

(Da un esempio nel nuovo libro Entity Framework di Julia Lerman.) Ho un database con due tabelle, Contatto e Indirizzo. La tabella Contatti ha un ContactID (int), così come il nome, il cognome, ecc. La tabella Indirizzo ha un ContactID, oltre a città, stato, zip, ecc.

Ecco una semplice query LINQ:

var addressGraphQuery = from a in context.Addresses.Include("Contact") orderby a.Contact.LastName, a.Contact.FirstName select a; 

Da SQL Profiler, vedo quanto segue:

 SELECT [Extent1].[addressID] AS [addressID], [Extent1].[City] AS [City], [Extent1].[StateProvince] AS [StateProvince], -- etc [Extent3].[ContactID] AS [ContactID1], [Extent3].[FirstName] AS [FirstName], [Extent3].[LastName] AS [LastName], -- etc FROM [dbo].[Address] AS [Extent1] INNER JOIN [dbo].[Contact] AS [Extent2] ON [Extent1].[ContactID] = [Extent2].[ContactID] LEFT OUTER JOIN [dbo].[Contact] AS [Extent3] ON [Extent1].[ContactID] = [Extent3].[ContactID] ORDER BY [Extent2].[LastName] ASC, [Extent3].[FirstName] ASC 

Si unisce alla tabella dei contatti due volte! Perché? C’è un modo semplice per prevenire questo?


Il mistero si approfondisce. I join spariscono quando rimuovo il orderby. I join non scompaiono quando imposto context.ContextOptions.LazyLoadingEnabled = false .

C’è anche una domanda simile qui:

Troppi join esterni a sinistra in Entity Framework 4?

Vedrò se c’è un Potere più alto che posso chiedere …

Grazie per aver segnalato questo problema. Sì, non è previsto vedere entrambi i join. Questo è un bug che è stato corretto nei bit attuali (non ancora rilasciati). Nei bit correnti la stessa query produce:

 SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name], [Extent1].[ContactId] AS [ContactId], ... [Extent2].[Id] AS [Id1], .. [Extent2].[FirstName] AS [FirstName], [Extent2].[LastName] AS [LastName] FROM [dbo].[Address] AS [Extent1] INNER JOIN [dbo].[Contact] AS [Extent2] ON [Extent1].[ContactId] = [Extent2].[Id] ORDER BY [Extent2].[LastName] ASC, [Extent2].[FirstName] ASC 

Mi piace mostrare che anche su 4.0 questo accade solo quando la relazione è 1: molti, 0..1: molti sembrano a posto.

Grazie,

Kati Iceva
Entity Framework Developer
Microsoft

Hobbes, non so perché stai ottenendo sia l’unione interna che quella esterna. Includi fa cose strane alle query. Ho rivolto la tua domanda alla squadra per vedere se ciò è previsto (per quanto sia cattivo) e se c’è un modo per alleggerirlo. La query in questione è solo un esempio per dimostrare che è ansible utilizzare le proprietà di navigazione ref di quadro in una query se si ottiene un binding.

Tendo ad usare la syntax lambda in modo che potrei sbagliarmi, ma penso che troverai che la tua seconda parte dell’ordine in base a clausole sia in realtà un “allora per”.

Per esempio

 var query = context.Addresses.Include("Contact") .OrderBy(a => a.Contact.LastName) .ThenBy(a => a.Contact.FirstName)