我试图强制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