Как собрать коллекцию элементов в одной ячейке ASPxGridView - PullRequest
2 голосов
/ 12 января 2012

Я использую ASP.NET 3.5, LLBLGenPro 3.0 и DevExpress 10.1.7.У меня есть ASPxGridView с LinqServerModeDataSource.Каждая строка ASPxGridView соответствует TaskEntity из LLBLGenPro.Одним из свойств TaskEntity является OrganizationCollection, которая представляет собой набор связанных OrganizationEntities.Что я хотел бы сделать, так это добавить столбец в ASPxGridView с именем OrgList, который бы отображал список связанных организаций по имени (в идеале в списке, ограниченном <br>, поэтому каждый элемент будет находиться в отдельной строке, носписок будет находиться в одной ячейке, что работает, если столбец имеет свойство EncodeHtml, установленное в значение «False»).

В настоящее время я имею в событии lsmdsTasks_Selecting () (это упрощенный пример):

IQueryable<TaskEntity> taskQuery;

taskQuery = TaskQueryStore.GetTasks(...);

var query = from task in taskQuery
            select new 
                   {
                       task.Id,
                       task.TaskName,
                       OrgList = ???
                   }

e.KeyExpression = "Id";
e.QueryableSource = query;

До сих пор я пробовал несколько вещей для "???",со следующими результатами:

Сначала я попробовал:

OrgList = task.OrganizationCollection.Aggregate("", (acc, item) => (acc == "" ? "" : acc + "<br>") + item.OrgName)

Это дало мне следующее исключение ORMException: «Агрегат» не поддерживается в этом поставщике Linq. Пожалуйста, попробуйте переписатьзапрос с использованием методов, которые поддерживаются. "

Затем я попытался:

OrgList = String.Join("<br>", task.OrganizationCollection.Select(x => x.OrgName).ToArray())

Это дало мне следующее исключение ORMException: «У вызова метода Join нет известной функции сопоставленной базы данных или другого известного обработчика.»

Единственное, что сработало, было:

OrgList = GetOrgList(task.Id)

, а затем отдельно определяем метод GetOrgList(), который берет идентификатор задачи и формирует список в нужном мне формате.и возвращает его в виде строки.Это действительно показывало данные в сетке так, как я хочу, но недостатком было то, что при попытке сортировки по этому столбцу он работает неправильно, а при попытке фильтрации по этому столбцу с помощью автофильтра он просто фильтруетвсе вне зависимостиПлюс, я полагаю, что он попадает в базу данных в несколько раз больше, чем необходимо.

Есть ли способ заставить это работать с сортировкой и фильтрацией без изменений?Или мне нужно будет отключить эти функции для этого столбца?

Ответы [ 2 ]

2 голосов
/ 20 ноября 2012

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

Примерно так:

<asp:Repeater runat="server" ID="repeater" Datasource='<%# OrgList %>'>
...
0 голосов
/ 20 февраля 2012

Я закончил тем, что выбирал задачи с prefetchPath в Organization, а затем использовал Aggregate в запросе в памяти Linq2Objects, затем передавал полученный список в источник данных моей таблицы, и это сработало.

...