LINQ AssociateWith для контекста данных, генерирующего LEFT JOIN вместо INNER JOIN - PullRequest
0 голосов
/ 11 декабря 2010

Я пытаюсь создать опцию загрузки данных «AssociateWith» для моего контекста, чтобы отфильтровать строки, к которым у текущего пользователя есть доступ.Моя простая модель данных такова:

Таблицы
UserPermissions
PK: ID
FK: RelatedUserID nullable
FK: RelatedItemID not nullable

Пользователи
PK: ID

Элементы
PK: ID
FK: 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]

Как я могу форсировать INNER JOINвместо левого внешнего присоединиться?Я неправильно моделирую свои отношения на бэкэнде?

Спасибо за любую помощь.

MMAS

1 Ответ

1 голос
/ 12 декабря 2010

LINQ to SQL генерирует LEFT OUTER JOIN просто потому, что столбец UserPermissions.RelatedUserID имеет значение NULL.Базовый поставщик LINQ просто недостаточно «умен», чтобы оптимизировать этот запрос до простого INNER JOIN.Я не думаю, что с этим можно что-то сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...