Я пытаюсь написать ObjectQuery с несколькими последовательными GroupJoin, это означает, что должен быть один основной выбор таблицы + несколько дополнительных LEFT JOIN. Я делаю это следующим образом, с помощью метода SelectMany, потому что без него я не могу получить доступ поля: Идентификатор ролиНесколько GroupJoin в одном запросе
var routesQuery = entities.Routes.Join(
entities.Locales,
Routes => Routes.LocaleID,
Locales => Locales.LocaleID,
(Routes, Locales) => new { Routes = Routes }
).GroupJoin(
entities.LinkRolesPermissions,
Routes => Routes.Routes.RouteID,
LinkRolesPermissions => LinkRolesPermissions.EntityID,
(Routes, LinkRolesPermissions) => new
{
LinkRolesPermissions = LinkRolesPermissions,
RoleID = LinkRolesPermissions.SelectMany(
LRS => LRS.RoleID,
(LRS, RoleID) => new { RoleID = LRS.RoleID }
)
}
)
.SelectMany(
LinkRolesPermissions => LinkRolesPermissions.RoleID,
(LinkRolesPermissions, RoleID) => new { RoleID = RoleID }
).GroupJoin(
entities.aspnet_Roles,
LRS => LRS.RoleID,
RLS => RLS.RoleId,
(LRS, RLS) => new { LRS = LRS }
);
Все работает, но он работает, как INNER JOIN в некотором роде, я понял, что метод SelectMany вызывает такое поведение. Он генерирует этот запрос:
SELECT 1 AS [C1], 1 AS [C2], [Extent3].[RoleID] AS [RoleID] FROM [dbo].[Routes] AS [Extent1]
INNER JOIN [dbo].[Locales] AS [Extent2] ON ([Extent1].[LocaleID] = [Extent2].[LocaleID]) OR (([Extent1].[LocaleID] IS NULL) AND ([Extent2].[LocaleID] IS NULL))
INNER JOIN [dbo].[LinkRolesPermissions] AS [Extent3] ON ([Extent1].[RouteID] = [Extent3].[EntityID]) OR (([Extent1].[RouteID] IS NULL) AND ([Extent3].[EntityID] IS NULL))
Я удалил его и получил следующее сообщение об ошибке:
var routesQuery = entities.Routes.Join(
entities.Locales,
Routes => Routes.LocaleID,
Locales => Locales.LocaleID,
(Routes, Locales) => new { Routes = Routes }
).GroupJoin(
entities.LinkRolesPermissions,
Routes => Routes.Routes.RouteID,
LinkRolesPermissions => LinkRolesPermissions.EntityID,
(Routes, LinkRolesPermissions) => new
{
LinkRolesPermissions = LinkRolesPermissions,
RoleID = LinkRolesPermissions.SelectMany(
LRS => LRS.RoleID,
(LRS, RoleID) => new { RoleID = LRS.RoleID }
)
}
)
.GroupJoin(
entities.aspnet_Roles,
LRS => LRS.RoleID,
RLS => RLS.RoleId,
(LRS, RLS) => new { LRS = LRS }
);
аргументы типа для метода «System.Linq.Enumerable.SelectMany (System.Collections.Generic .Inumerable, System.Func>, System.Func) ' не может быть выведен из использования. Попробуйте , указав аргументы типа явно.
Может ли кто-нибудь объяснить мне это поведение, пожалуйста, и посоветуйте, как исправить его, если это возможно.
Заранее благодарен.
P.S. Метод «Включить» объединяет таблицы в геометрической прогрессии (известная ошибка), поэтому целесообразно только присоединиться к одной таблице, если будет больше одного, то в реальной таблице каждая таблица будет объединена столько раз, сколько «Include» будет использоваться в течение текущего запрос. – Anonymous