我试图强制 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 ...
)
现在我正在使用不寻常的数据库,因为有一个我无法控制的原因导致人员从 People 表中丢失但在 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 子句。作为最纯粹的我想删除它。任何想法或当前的数据库设计是否束缚了我的手?
最佳答案
由于 PersonId 被声明为 NOT NULL
(并且我假设它被声明为对 People 的 FK),那么我不确定您如何与未分配的人建立 CompanyPosition;并且 Linq 看不到您如何 eiter,这就是为什么正如您所观察到的,Linq 认为连接是多余的。
关于c# - 强制linq执行内连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8243003/