Tôi đang cố ép buộc LINQ tạo thành một kết nối bên trong giữa hai bảng. Tôi sẽ đưa ra một ví dụ.Buộc linq để thực hiện các kết nối bên trong
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 ...
)
Bây giờ tôi đang làm việc với cơ sở dữ liệu bất thường vì không thể kiểm soát mọi người bị thiếu trong bảng Mọi người nhưng có hồ sơ trong CompanyPositions. Tôi muốn lọc ra CompanyPositions với những người mất tích bằng cách tham gia các bảng.
return (from pos in CompanyPositions
join p in People on pos.PersonId equals p.PersonId
select pos).ToList();
LINQ coi tham gia này là dự phòng và loại bỏ nó khỏi SQL nó tạo ra.
SELECT
[Extent1].[CompanyPositionId] AS [CompanyPositionId],
[Extent1].[CompanyId] AS [CompanyId],
....
FROM [dbo].[CompanyPositions] AS [Extent1]
Tuy nhiên, nó không thừa trong trường hợp của tôi. Tôi có thể sửa nó như thế này
// 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();
Tuy nhiên điều này bây giờ tạo ra một mệnh đề whereless trong SQL của tôi. Là một người tinh khiết nhất tôi muốn loại bỏ điều này. Bất kỳ ý tưởng hoặc thiết kế cơ sở dữ liệu hiện tại buộc tay tôi?
bạn đang sử dụng gì? LINQ to SQL? LINQ to Entities? Thứ gì khác? – svick
Mô hình của bạn có thuộc tính điều hướng không? Nếu có, bạn có thể viết một cái gì đó như 'where pos.Person! = Null'. – svick
Tôi đang sử dụng LinqToSql, tôi đã thử 'where pos.Person! = Null' và 'p.PersonId! = 0' và Linq xóa chúng. Trong trường hợp 'p.PersonId! = 0', nó sẽ thay đổi thành 'pos.PersonId! = 0' gây ấn tượng với tôi ngay cả khi đó không phải là những gì tôi theo sau. – Magpie