2010-12-11 2 views
0

현재 컨텍스트에 대해 "AssociateWith"데이터로드 옵션을 만들어 현재 사용자가 액세스 할 수있는 행을 필터링하려고합니다.LINQ AssociateWith는 내부 조인 대신 LEFT JOIN을 생성합니다.

테이블
UserPermissions
PK : ID
FK : 내 간단한 데이터 모델은 그대로 Null을 허용하지 RelatedItemID

사용자
PK : ID

널 (NULL)
FK를 RelatedUserID 항목
PK : ID
FK : Null을 허용하지 RelatedCategoryID

카테고리 PK : ID 내 데이터 컨텍스트에

, 나는 같은 것을 할 노력하고있어 :

//dbContext is my LINQ context 
//current_user_id is the id of my current logged in user 
var dlo = new DataLoadOptions(); 
//issue->UsersPermissions is one->many relationship 
// if I omit this LoadWith line, no associatewith filter 
// is created in the generated sql code 
dlo.LoadWith<Items>(i=>i.UserPermissions); 

dlo.AssociateWith<Items>(i=> 
i.UserPermissions.Where(p=> 
p.RelatedUserID.HasValue && p.RelatedUserID.Value == current_users_id)); 
dbContext.LoadOptions = dlo; 

모든 것이 나에게 합리적인 것 같다,하지만 쿼리는 SQL에서 생성 된

SELECT [t0].[ID], [t1].[ID] AS [ID2], [t1].[RelatedUserID], [t1].[RelatedItemID] 
(SELECT COUNT(*) 
FROM [dbo].[UserPermissions] AS [t2] 
WHERE (([t2].[RelatedUserID] = @p0)) AND ([t2].[RelatedItemID] = [t0].[ID]) 
) AS [value] 
FROM [dbo].[Items] AS [t0] 
LEFT OUTER JOIN [dbo].[UserPermissions] AS [t1] ON ([t1].[RelatedUserID] = @p0) 
AND  
([t1].[RelatedItemID] = [t0].[ID]) 
ORDER BY [t0].[ID], [t1].[ID] 

어떻게 LEFT OUTER JOIN 대신 INNER JOIN을 강제 적용 할 수 있습니까? 백엔드에서 내 관계를 잘못 모델링하고 있습니까?

도움 주셔서 감사합니다. SQL에

MMAS

답변

1

LINQ 왼쪽 외부 UserPermissions.RelatedUserID 컬럼 널이기 때문에 가입 생성한다. 기본 LINQ 공급자는 단순한 INNER JOIN으로 쿼리를 최적화하기에 충분하지 못합니다. 나는 당신이 이것에 대해 할 수있는 일이 없다고 생각합니다.

+0

그게 내가 두려웠 던 이유입니다. - 궁금한 점이 있으시면, 테이블이 결국 nullable이고 실제로는 RelatedUserID 또는 다른 FK를 참조 할 것이기 때문에 nullable입니다. RelatedUsersCompanyID가 항상 제공됩니다. 아이디어는 항목에 대한 액세스 권한이있는 각 사용자에 대해 사용자 테이블에 행을 추가하는 대신 특정 사용자가 특정 항목에 액세스 할 수있는 행을 추가 할 수 있다는 것입니다. 그런 데이터 모델에 대해 AssociateWith 메서드로 원하는 동작을 어떻게 얻을 수 있는지에 대한 멋진 아이디어가 있습니까? :) – Mustafakidd

+0

사용자 용 테이블과 회사 용 테이블에'UserPermissions' 테이블을 담을 수 없습니까? 일반적으로 데이터베이스의 Null 허용 열 수를 최소화해야합니다. 게다가'Associatewith'를 사용하여 필터를 만드는 이유는 무엇입니까? 그냥 '일반적인'방법 (LINQ 쿼리)을 필터링하지 않는 이유가 있습니까? – Steven

+0

우리는 거의 항상 권한을 필터링하기 때문에 datacontext에 필터를 작성함으로써 개발자가 더 쉽게 만들 수 있기를 바랍니다. 불행히도 필자는 왜 필자가 필요한 퍼미션 테이블에서 내 RelatedItemID를 만들지 만, 나는 여전히 왼쪽 외부 조인을 생성한다. 왜 그런 경우에 단서가없는 ... – Mustafakidd