2

我正在使用 ASP.NET 3.5、LLBLGenPro 3.0 和 DevExpress 10.1.7。我有一个带有 LinqServerModeDataSource 的 ASPxGridView。ASPxGridView 的每一行对应一个来自 LLBLGenPro 的 TaskEntity。TaskEntity 的属性之一是 OrganizationCollection,它是相关组织实体的集合。我想做的是向 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()单独定义方法,该方法采用任务 ID 并以我想要的格式构建列表,并将其作为字符串返回。这实际上确实以我想要的方式显示了网格中的数据,但缺点是当您尝试对此列进行排序时,它无法正常工作,并且当您尝试使用 AutoFilter 过滤此列时,它只是过滤一切都出来了,不管。另外,我想它对数据库的访问次数超出了必要的数倍。

有什么办法可以使它与完整的排序和过滤一起工作?或者我需要为此专栏禁用这些功能吗?

4

2 回答 2

2

尝试为您的专栏使用带有中继器的模板。您可以使用数据绑定将 OrgList 从列传递到转发器。

像这样的东西:

<asp:Repeater runat="server" ID="repeater" Datasource='<%# OrgList %>'>
...
于 2012-11-20T13:27:25.577 回答
0

我最终使用组织的 prefetchPath 获取任务,然后在 Linq2Objects 内存查询中使用 Aggregate,然后将结果列表传递给我的网格的数据源,这很有效。

于 2012-02-20T15:14:43.153 回答