Групповое объединение Выбрать с запятой - PullRequest
0 голосов
/ 18 марта 2019

У меня есть запрос Как показано ниже в .net Core 2.2 с EF.

var data = context.Customer
                    .GroupJoin(context.Orders, c=> c.Id, o => o.CustoerId, (c, o) => new
                    {
                        customer = c,
                        orders= o
                    }).Select(s => new
                    {
                        s.customer.Name,
                        s.customer.Id,
                        AllOrdersRef = s.orders == null ? null : string.Join(", ", s.orders.Select(x => x.UniquRef))
                    });

выдает ошибку

Не удалось перевести выражение LINQ 'Count ()', и оно будет оценено локально.

Все, что мне нужно, это значение, разделенное запятыми, в AllOrdersRef. Также я не хочу использовать ToList ().

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Вы должны сделать join запрос и затем обработать его результат на клиенте стороне:

var data = (from c in context.Customer
            join o in context.Orders on c.Id equals o.CustomerId into subs
            from sub in subs.DefaultIfEmpty()
            select new 
            {
                 c.Id,
                 c.Name,
                 UniquRef = sub == null ? null : sub.UniquRef
            }).ToList();

var result = data.GroupBy(x => new { x.Id, x.Name }).Select(x => new 
             {
                 x.Key.Id,
                 x.Key.Name, 
                 AllOrdersRef = (x.Count() == 1 && x.First().UniquRef == null) ? null
                                    : String.Join(", ", x.Select(y => y.UniquRef))
             });
0 голосов
/ 18 марта 2019

Относительно сервера Sql (если это ваша СУБД), есть две основные функции, которые выполняют конкатенацию string на выходе group by, XML Path и String_Agg (из Sql Server 2017) , ни одна из которых поддерживается в linq to sql. Насколько мне известно, она не поддерживается и для других СУБД, поэтому единственный способ, которым вы можете это сделать, - привести ее к Enumerable до string.Join.
Для этого вам просто нужно позвонить ToList() до Select:

var data = context.Customer
                    .GroupJoin(context.Orders, c=> c.Id, o => o.CustoerId, (c, o) => new
                    {
                        customer = c,
                        orders= o
                    })
                    .ToList()
                    .Select(s => new
                    {
                        s.customer.Name,
                        s.customer.Id
                        AllOrdersRef = s.orders == null ? null : string.Join(", ", s.orders.Select(x => x.UniquRef))
                    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...