c# - 强制linq执行内连接

标签 c# sql linq linq-to-sql

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

相关文章:

c# - LINQ 查询中奇怪的扩展方法行为

c# - Entity Framework 程序集中的重复类型名称 (6.1.0)

c# - 如何将 LINQ 与动态集合一起使用

sql - 在 Oracle 中删除小于最大序列号的记录

c# - Azure 发布 :a runtime component is missing:/base/x64/IISConfigurator. exe

c# - 管理列表项的困难

c# - 可轻松与 C# 和 .NET 一起使用的 winforms 替代品

php - 如何使用由日期和用户名分隔的 while 循环添加列的不同值(行)

python - html 和 sql 与 python

c# - 与通用处理程序交互