Как собрать коллекцию элементов в одной ячейке ASPxGridView

Я использую 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(), который берет идентификатор задачи и создает список в нужном мне формате и возвращает его в виде строки. На самом деле это отображало данные в сетке так, как я этого хочу, но недостатком было то, что когда вы пытаетесь отсортировать этот столбец, он работает неправильно, и когда вы пытаетесь отфильтровать этот столбец с помощью автофильтра, он просто фильтрует все вне зависимости от того. Кроме того, я полагаю, что он обращается к базе данных в несколько раз больше, чем необходимо.

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


person RebelScum    schedule 11.01.2012    source источник
comment
Какая должна работать сортировка по этому столбцу?   -  person Filip    schedule 12.01.2012
comment
Я ожидаю, что он будет сортироваться на основе последней строки, возвращаемой в этом столбце, т.е. если одна ячейка в столбце имеет значение A‹br›B‹br›C, а вторая — B‹br›C‹br›D , он будет сортировать на основе этих значений, просто рассматривая их как строки.   -  person RebelScum    schedule 12.01.2012
comment
Какой ORM вы используете для генерации LLBLGen Pro? (LLBLGen Pro Runtime Framework 3.1, Entity Framework v1, Entity Framework v4, Linq to Sql, NHibernate 2.x/3.0 (hbm.xml и FluentNHibernate))   -  person JamieSee    schedule 31.01.2012


Ответы (2)


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

Что-то вроде этого :

<asp:Repeater runat="server" ID="repeater" Datasource='<%# OrgList %>'>
...
person Synryu    schedule 20.11.2012

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

person RebelScum    schedule 20.02.2012