如何在ASPxGridView的一个单元格中聚合项的集合
本文关键字:单元格 集合 一个 ASPxGridView | 更新日期: 2023-09-27 18:19:59
我使用的是ASP.NET 3.5、LLBLGenPro 3.0和DevExpress 10.1.7。我有一个带有LinqServerModeDataSource的ASPxGridView。ASPxGridView的每一行都对应于LLBLGenPro中的TaskEntity。TaskEntity的属性之一是OrganizationCollection,它是相关OrganizationEntity的集合。我想做的是在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并以我想要的格式构建列表,并将其作为字符串返回。这确实以我想要的方式显示了网格中的数据,但缺点是,当你试图对此列进行排序时,它无法正常工作,而当你试图使用"自动筛选"对此列进行筛选时,它只会过滤掉所有内容。另外,我想它对数据库的访问次数比必要的要多出几次。
有什么方法可以让它在排序和过滤完好无损的情况下工作吗?或者我需要禁用本专栏的这些功能吗?
尝试为您的列使用带有中继器的模板。您可以使用数据绑定将OrgList从列传递到中继器。
类似这样的东西:
<asp:Repeater runat="server" ID="repeater" Datasource='<%# OrgList %>'>
...
我最终用prefetchPath to Organization获取任务,然后在Linq2Objects in memory查询中使用Aggregate,然后将结果列表传递到网格的数据源,这就成功了。