Как создать Stuff и XML PATH (SQL) в Linq или Lambda - PullRequest
0 голосов
/ 03 июня 2018

Как создать эквивалентный код в Linq или lambda?

Я использую Entity Framework Core на Asp.net Core 2.

SELECT 
    (SELECT 
         STUFF((SELECT DISTINCT ', ' + Roles.Name
                FROM AspNetUsers Users
                INNER JOIN AspNetUserRoles UserRoles ON UserRoles.UserId = Users.Id
                INNER JOIN AspNetRoles Roles ON Roles.Id = UserRoles.RoleId
                WHERE AspNetUsers.Id = UserRoles.UserId
                FOR XML PATH('')), 1, 2, '')) AS 'Roles', 
    AspNetUsers.*                    
FROM 
    AspNetUsers AspNetUsers

1 Ответ

0 голосов
/ 03 июня 2018

У меня был бы запрос, похожий на этот.Если вы профилируете запрос, вы заметите, что часть STUFF ... FOR XML PATH вычисляется в памяти .NET вместо SQL.

var test = (
    from u in ctx.Users
    join ur in ctx.UserRoles on u.Id equals ur.UserId
    join r in ctx.Roles on ur.RoleId equals r.Id
    group r by u into g
    select new { User = g.Key, Roles = string.Join(",", g.Select(y => y.Name)) }
           );

Примечание: Работать сзапрос, сохраняющий пользователя как объект, вместо расширения всех его свойств

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