Próbuję zmusić Linq do przeprowadzenia wewnętrznego połączenia między dwoma tabelami. Dam przykład.Wymuszanie linq do wykonywania połączeń wewnętrznych
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 ...
)
Teraz pracuję z niezwykłej bazie danych, ponieważ nie jest to powód, poza moją kontrolą, by ludzie mogli być brakuje tabeli ludzi, ale posiada rekord w CompanyPositions. Chcę odfiltrować CompanyPositions z brakującymi osobami, dołączając do tabel.
return (from pos in CompanyPositions
join p in People on pos.PersonId equals p.PersonId
select pos).ToList();
Linq traktuje to sprzężenie jako zbędne i usuwa je z generowanego przez siebie kodu SQL.
SELECT
[Extent1].[CompanyPositionId] AS [CompanyPositionId],
[Extent1].[CompanyId] AS [CompanyId],
....
FROM [dbo].[CompanyPositions] AS [Extent1]
Jednak w moim przypadku nie jest to zbyteczne. Mogę to naprawić tak:
// 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();
Jednak teraz to tworzy niepotrzebną klauzulę where w moim SQL. Jako najczystsze chciałbym to usunąć. Każdy pomysł czy obecny projekt bazy danych wiążą moje ręce?
Czego używasz? LINQ do SQL? LINQ do jednostek? Coś innego? – svick
Czy Twój model ma właściwości nawigacyjne? Jeśli tak, możesz napisać coś takiego: 'where pos.Person! = Null'. – svick
Używam LinqToSql, próbowałem "gdzie pos.Person! = Null" i "p.PersonId! = 0" i Linq je usuwa. W przypadku "p.PersonId! = 0" zmienia się na "pos.PersonId! = 0", co robi na mnie wrażenie, nawet jeśli nie jest to coś, do czego dążę. – Magpie