2011-11-23 2 views
10

Linq 강제로 두 테이블 간의 내부 조인을 preform하려면 노력하고있어. 예를 들어 보겠습니다. 사람들이 사람들 테이블에서 누락하지만 CompanyPositions의 기록이 될 내 통제 할 수없는 이유가 거기로 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을 테이블에 조인함으로써 걸러 내고 싶다.

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 절이 생성됩니다. 순수한 나는 이것을 제거하고 싶습니다. 어떤 생각이든, 현재의 데이터베이스 디자인이 내 손을 묶는가?

+1

? LINQ to SQL? 엔티티에 대한 LINQ? 다른 것? – svick

+1

모델에 탐색 속성이 있습니까? 그렇다면'where pos.Person! = null'과 같이 쓸 수 있습니다. – svick

+0

LinqToSql을 사용하고 있는데, 'pos.Person! = null'및 'p.PersonId! = 0'을 시도하고 Linq가이를 제거합니다. 'p.PersonId! = 0'의 경우 'pos.PersonId! = 0'으로 바뀌어 그것이 내가 겪은 것이 아니더라도 나를 감동시킵니다. – Magpie

답변

2

NOT NULL을 선언 (내가이 사람에 FK로 선언 가정을) 할당되지 않은 사람과 CompanyPosition을 가질 수있는 방법; Linq는 당신이 어떻게 eiter를 할 수 있는지를 볼 수 없기 때문에, Linq가 join 중복을 고려한 것을 볼 수 있습니다.

+1

그 말이 맞습니다. 제가 작업하고있는 데이터베이스는 훨씬 크고 복잡한 마스터의 평평한 버전입니다. FK가없는 이러한 누락 된 레코드로 인해 한 제품과 관련된 데이터 만이 레코드로 전달됩니다. 이러한 레코드는 마스터에 적용됩니다. 이 경우 사람은 게시되지 않아 마스터에서 푸시되지 않습니다. 이상적으로도 CompanyPosition도 아니지만 이것은 내 통제에서 벗어났습니다. db 디자인이 여기에서 중요한 문제인 것처럼 보입니다. – Magpie

0

당신이 LinqToSql를 사용하는 경우, 당신은이 유사 LoadWith 사용할 수 있습니다 : 나는 확실하지 않다 PersonId 이후

var context = new MyDataContext(); 
var options = new DataLoadOptions(); 
options.LoadWith<People>(x => x.CompanyPositions); 
context.LoadOptions = options; 
0

linq에서 조인을 사용하는 방법을 모르겠습니다. 그러나 다음의 문장은 당신에게 필요한 결과를 줄 것입니다.

return (from pos in CompanyPositions 
     where (p in People select p.PersonId).Contains(pos.PersonId) 
     select pos).ToList(); 
0

클라이언트 측 변환 :

(
from pos in CompanyPositions 
join p in People on pos.PersonId equals p.PersonId 
select new {pos, p} 
).ToList().Select(x => x.pos); 

더 직접 필터링 : 당신은 무엇을 사용하는

from pos in CompanyPositions 
where pos.People.Any() 
select pos 
관련 문제