我試圖強制Linq在兩個表之間執行內部連接。我會舉一個例子。強制linq執行內部連接
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 ...
)
現在,我有不尋常的數據庫工作作爲是有原因的超出了我的控制,爲人們從人民表中缺少但在CompanyPositions的記錄。我想通過加入表格來過濾掉缺少People的CompanyPositions。
return (from pos in CompanyPositions
join p in People on pos.PersonId equals p.PersonId
select pos).ToList();
Linq將此連接視爲多餘並將其從其生成的SQL中移除。
SELECT
[Extent1].[CompanyPositionId] AS [CompanyPositionId],
[Extent1].[CompanyId] AS [CompanyId],
....
FROM [dbo].[CompanyPositions] AS [Extent1]
然而,在我的情況下,這不是多餘的。我可以這樣修復它
// 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();
但是,現在在我的SQL中創建了一個不必要的where子句。作爲最純粹的我想刪除這個。任何想法或當前的數據庫設計是否與我的手一致?
你在使用? LINQ to SQL? LINQ to Entities?還有別的嗎? – svick
您的模型是否具有導航屬性?如果是這樣,你可以寫一些像'where pos.Person!= null'。 – svick
我正在使用LinqToSql,我試過'where pos.Person!= null'和'p.PersonId!= 0',Linq刪除它們。在'p.PersonId!= 0'的情況下,它將其更改爲'pos.PersonId!= 0',即使它不是我所追求的,也會給我留下深刻的印象。 – Magpie