Por lo tanto, se dan cuenta de que estoy tarde a la fiesta aquí, sin embargo pensé que me gustaría añadir mis hallazgos.Esto realmente debería ser un comentario en la publicación de Alex James, pero como no tengo la reputación, tendrá que ir aquí.
Así que mi respuesta es: parece que no funciona en absoluto como sería su intención. Alex James ofrece dos soluciones interesantes, sin embargo, si las pruebas y compruebas el SQL, es horrible.
El ejemplo que estaba trabajando es:
var theRelease = from release in context.Releases
where release.Name == "Hello World"
select release;
var allProductionVersions = from prodVer in context.ProductionVersions
where prodVer.Status == 1
select prodVer;
var combined = (from release in theRelease
join p in allProductionVersions on release.Id equals p.ReleaseID
select release).Include(release => release.ProductionVersions);
var allProductionsForChosenRelease = combined.ToList();
Esto sigue a la más simple de las dos ejemplos. Sin incluirla produce el sql perfectamente respetable:
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Name] AS [Name]
FROM [dbo].[Releases] AS [Extent1]
INNER JOIN [dbo].[ProductionVersions] AS [Extent2] ON [Extent1].[Id] = [Extent2].[ReleaseID]
WHERE ('Hello World' = [Extent1].[Name]) AND (1 = [Extent2].[Status])
Pero con, OMG:
SELECT
[Project1].[Id1] AS [Id],
[Project1].[Id] AS [Id1],
[Project1].[Name] AS [Name],
[Project1].[C1] AS [C1],
[Project1].[Id2] AS [Id2],
[Project1].[Status] AS [Status],
[Project1].[ReleaseID] AS [ReleaseID]
FROM (SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Name] AS [Name],
[Extent2].[Id] AS [Id1],
[Extent3].[Id] AS [Id2],
[Extent3].[Status] AS [Status],
[Extent3].[ReleaseID] AS [ReleaseID],
CASE WHEN ([Extent3].[Id] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
FROM [dbo].[Releases] AS [Extent1]
INNER JOIN [dbo].[ProductionVersions] AS [Extent2] ON [Extent1].[Id] = [Extent2].[ReleaseID]
LEFT OUTER JOIN [dbo].[ProductionVersions] AS [Extent3] ON [Extent1].[Id] = [Extent3].[ReleaseID]
WHERE ('Hello World' = [Extent1].[Name]) AND (1 = [Extent2].[Status])
) AS [Project1]
ORDER BY [Project1].[Id1] ASC, [Project1].[Id] ASC, [Project1].[C1] ASC
basura total. El punto clave a tener en cuenta aquí es el hecho de que devuelve la versión unida externa de la tabla que no ha sido limitada por el estado = 1.
Esto hace que los datos erróneos que se devuelven:
Id Id1 Name C1 Id2 Status ReleaseID
2 1 Hello World 1 1 2 1
2 1 Hello World 1 2 1 1
Tenga en cuenta que el estado de las 2 está siendo devuelto allí, a pesar de nuestra restricción. Simplemente no funciona. Si me he equivocado en alguna parte, estaría encantado de descubrirlo, ya que esto es una burla a Linq. Me encanta la idea, pero la ejecución no parece ser utilizable en este momento.
Por curiosidad, probé el LinqToSql DBML en lugar de la edmx LinqToEntities que produjo el desastre anterior:
SELECT [t0].[Id], [t0].[Name], [t2].[Id] AS [Id2], [t2].[Status], [t2].[ReleaseID], (
SELECT COUNT(*)
FROM [dbo].[ProductionVersions] AS [t3]
WHERE [t3].[ReleaseID] = [t0].[Id]
) AS [value]
FROM [dbo].[Releases] AS [t0]
INNER JOIN [dbo].[ProductionVersions] AS [t1] ON [t0].[Id] = [t1].[ReleaseID]
LEFT OUTER JOIN [dbo].[ProductionVersions] AS [t2] ON [t2].[ReleaseID] = [t0].[Id]
WHERE ([t0].[Name] = @p0) AND ([t1].[Status] = @p1)
ORDER BY [t0].[Id], [t1].[Id], [t2].[Id]
ligeramente más compacto - Cláusula de recuento raro, pero en general misma FALLO total.
¿Alguien ha usado alguna vez esto en una aplicación comercial real? Realmente me estoy empezando a preguntar ... Por favor, dime que me he perdido algo obvio, ¡ya que realmente me gustaría Linq!
¿Por qué crees que es así? ¿Ustedes lo valoran después de la ejecución? – pocheptsov
Supongo que "Propiedades" no es la cadena real que está pasando a Incluir. Esto significa que ha omitido la parte más importante de la pregunta. Además, me pregunto por qué estás usando join en absoluto; las propiedades de navegación son generalmente la forma correcta de atravesar las relaciones en Entity Framework. –
pocheptsov - Sé que Propiedades no se ha cargado porque Proeprties.IsLoaded es falso Hola Craig - "Propiedades" es la cadena correcta. La unión está en una propiedad de navegación diferente Elementos. La unión está ahí porque tengo un valor para una propiedad de un objeto Item (Collection.ID) pero quiero una entidad que esté relacionada con ella. Lee –