Estoy intentando forzar a Linq a realizar una unión interna entre dos tablas. Daré un ejemplo.Obligar a linq a realizar uniones internas
CREATE TABLE [dbo].[People] (
[PersonId] [int] NOT NULL,
[Name] [nvarchar](MAX) NOT NULL,
[UpdatedDate] [smalldatetime] NOT NULL
... Other fields ...
)
CREATE TABLE [dbo].[CompanyPositions] (
[CompanyPositionId] [int] NOT NULL,
[CompanyId] [int] NOT NULL,
[PersonId] [int] NOT NULL,
... Other fields ...
)
Ahora estoy trabajando con la base de datos inusual ya que hay una razón más allá de mi control para que la gente no aparecer en la tabla personas, pero tienen un registro en CompanyPositions. Quiero filtrar las posiciones de la compañía con personas desaparecidas al unirme a las tablas.
return (from pos in CompanyPositions
join p in People on pos.PersonId equals p.PersonId
select pos).ToList();
Linq ve esta unión como redundante y la elimina del SQL que genera.
SELECT
[Extent1].[CompanyPositionId] AS [CompanyPositionId],
[Extent1].[CompanyId] AS [CompanyId],
....
FROM [dbo].[CompanyPositions] AS [Extent1]
Sin embargo, no es redundante en mi caso. Puedo arreglarlo así
// The min date check will always be true, here to force linq to perform the inner join
var minDate = DateTimeExtensions.SqlMinSmallDate;
return (from pos in CompanyPositions
join p in People on pos.PersonId equals p.PersonId
where p.UpdatedDate >= minDate
select pos).ToList();
Sin embargo, esto ahora crea una cláusula where innecesaria en mi SQL. Como más puro me gustaría eliminar esto. ¿Alguna idea o el diseño actual de la base de datos me ata?
¿Qué estás usando? LINQ to SQL? LINQ a las entidades? ¿Algo más? – svick
¿Su modelo tiene propiedades de navegación? Si es así, podría escribir algo como 'where pos.Person! = Null'. – svick
Estoy usando LinqToSql, he intentado 'where pos.Person! = Null' y 'p.PersonId! = 0' y Linq los elimina. En el caso de 'p.PersonId! = 0' lo cambia a 'pos.PersonId! = 0' que me impresiona incluso si no es lo que estoy buscando. – Magpie