2016-04-22 2 views
0

Рассмотрим следующий PL/SQL-запрос:Выражение функциональности Oracle LISTAGG() в LINQ?

SELECT department_id, LISTAGG(last_name, '; ') 
    WITHIN GROUP (ORDER BY last_name) "Emp_list" 
FROM employees 
GROUP BY department_id; 

Would бы LINQ эквивалент выше? Спасибо!

+1

Почему бы не использовать 'string.Join' ([Example] (http://www.dotnetperls.com/string-join))? –

+0

Да, но что вы также хотите вернуть из таблицы другие столбцы? См. Обновление SQL. – uncoder

ответ

0

EDIT: Поскольку вы хотите другие столбцы и хотите сгруппировать, вы не можете использовать метод, который я изначально предлагал как есть. Вот новое решение, хотя генерируемый SQL не совсем велик:

from employee in employees 
group employee by employee.department_id into grpEmployee 
select new { 
    DepartmentId = grpEmployee.Key, 
    LastNames = string.Join(", ", employees.Where(e => e.department_id == grpEmployee.Key) 
            .OrderBy(e => e.last_name).Select(e => e.last_name)) 
} 

Обратите внимание, что этот метод сочетает в себе оба запроса, как и лямбда-синтаксис.


Это должно сделать трюк. Мы выбираем все последние имена, а затем объединяем их в одну строку в качестве конечного результата.

string.Join("; ", (from employee in employees 
        where employee.department_id == 30 
        orderby employee.last_name 
        select employee.last_name)) 
+0

Спасибо! К сожалению, я должен был привести более подробный пример, в котором будет возвращена не только комбинированная строка, но и некоторые другие столбцы. Я обновил инструкцию SQL в своем вопросе. – uncoder

+0

@uncoder Я обновил свой ответ с помощью нового решения – Connor

+1

Спасибо, но это не работает: '' System.NotSupportedException: LINQ to Entities не распознает метод. System.String Join (System.String, System.Collections .Generic.IEnumerable'1 [System.String]) ', и этот метод не может быть переведен в выражение хранилища. в System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.DefaultTranslator.Translate (родитель ExpressionConverter, вызов методаCallExpression) ... '' – uncoder