Sto provando a forzare Linq a preformare un inner join tra due tabelle. Darò un esempio.Forzare linq per eseguire join interni
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 ...
)
ora sto lavorando con il database insolito come c'è una ragione al di là del mio controllo per le persone a mancare dalla tabella persone, ma hanno un record in CompanyPositions. Voglio filtrare le Posizioni Aziendali con le Persone scomparse unendole alle tabelle.
return (from pos in CompanyPositions
join p in People on pos.PersonId equals p.PersonId
select pos).ToList();
Linq vede questo join come ridondante e lo rimuove dall'SQL generato.
SELECT
[Extent1].[CompanyPositionId] AS [CompanyPositionId],
[Extent1].[CompanyId] AS [CompanyId],
....
FROM [dbo].[CompanyPositions] AS [Extent1]
Tuttavia nel mio caso non è ridondante. Posso risolvere il problema in questo modo
// 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();
Tuttavia, questo ora crea un inutile in cui la clausola nel mio SQL. Per quanto mi riguarda vorrei rimuoverlo. Qualche idea o l'attuale design del database mi lega le mani?
Cosa stai usando? LINQ a SQL? LINQ alle entità? Qualcos'altro? – svick
Il modello ha proprietà di navigazione? Se è così, potresti scrivere qualcosa come 'where pos.Person! = Null'. – svick
Sto usando LinqToSql, ho provato 'dove pos.Person! = Null' e 'p.PersonId! = 0' e Linq li rimuove. Nel caso di 'p.PersonId! = 0' lo cambia in 'pos.PersonId! = 0' che mi impressiona anche se non è quello che sto cercando. – Magpie