현재 컨텍스트에 대해 "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
그게 내가 두려웠 던 이유입니다. - 궁금한 점이 있으시면, 테이블이 결국 nullable이고 실제로는 RelatedUserID 또는 다른 FK를 참조 할 것이기 때문에 nullable입니다. RelatedUsersCompanyID가 항상 제공됩니다. 아이디어는 항목에 대한 액세스 권한이있는 각 사용자에 대해 사용자 테이블에 행을 추가하는 대신 특정 사용자가 특정 항목에 액세스 할 수있는 행을 추가 할 수 있다는 것입니다. 그런 데이터 모델에 대해 AssociateWith 메서드로 원하는 동작을 어떻게 얻을 수 있는지에 대한 멋진 아이디어가 있습니까? :) – Mustafakidd
사용자 용 테이블과 회사 용 테이블에'UserPermissions' 테이블을 담을 수 없습니까? 일반적으로 데이터베이스의 Null 허용 열 수를 최소화해야합니다. 게다가'Associatewith'를 사용하여 필터를 만드는 이유는 무엇입니까? 그냥 '일반적인'방법 (LINQ 쿼리)을 필터링하지 않는 이유가 있습니까? – Steven
우리는 거의 항상 권한을 필터링하기 때문에 datacontext에 필터를 작성함으로써 개발자가 더 쉽게 만들 수 있기를 바랍니다. 불행히도 필자는 왜 필자가 필요한 퍼미션 테이블에서 내 RelatedItemID를 만들지 만, 나는 여전히 왼쪽 외부 조인을 생성한다. 왜 그런 경우에 단서가없는 ... – Mustafakidd