我继承了一个使用 llblgen 2.6 的应用程序。我有一个 PersonAppointmentType 实体,它具有 AppointmentType 属性(n:1 关系)。现在我想根据 AppointmentType 的名称对 PersonAppointmentType 的集合进行排序。到目前为止我在 Page_Load 中尝试过:
if (!Page.IsPostBack)
{
var p = new PrefetchPath(EntityType.PersonAppointmentTypeEntity);
p.Add(PersonAppointmentTypeEntity.PrefetchPathAppointmentType);
dsItems.PrefetchPathToUse = p;
// dsItems.SorterToUse = new SortExpression(new SortClause(PersonAppointmentTypeFields.StartDate, SortOperator.Ascending)); // This works
dsItems.SorterToUse = new SortExpression(new SortClause(AppointmentTypeFields.Name, SortOperator.Ascending));
}
我可能只是没明白。
编辑: 菲尔让我走上了正轨,这有效:
if (!Page.IsPostBack)
{
dsItems.RelationsToUse = new RelationCollection(PersonAppointmentTypeEntity.Relations.AppointmentTypeEntityUsingAppointmentTypeId);
dsItems.SorterToUse = new SortExpression(new SortClause(AppointmentTypeFields.Name, SortOperator.Ascending));
}
最佳答案
如果您想要精确的解决方案,则需要共享更多代码。您没有发布实际获取实体(或集合)的代码。这可能看起来不相关,但它(可能)是相关的,因为我猜您犯了人们在第一次尝试对相关实体进行排序或过滤时使用预取路径时犯的常见错误。
您有一个从 PersonAppointmentType (PAT) 到 AppointType (AT) 的预取路径。这基本上告诉框架将 PAT 作为一个查询来获取,然后在该查询完成后,根据 PAT 查询的结果来获取 AT。 LLBLGen 会为您处理所有这些事情,并在查询完成后将对象连接在一起。
您想要做的是按您在第二个查询中获取的实体对第一个查询进行排序。如果您用 SQL 术语思考,则需要在第一个查询中从 PAT=>AT 进行联接。为此,您需要通过 RelationPredicateBucket 添加关系(联接)并将其作为 fetch 调用的一部分传递。
乍一看似乎违反直觉,但关系和预取路径完全不相关(尽管您可以将它们一起使用)。您甚至可能根本不需要预取路径;您可能只需要将关系和排序子句添加到您的获取代码中(取决于您是否确实希望图表中存在 AT 实体,还是按其字段排序的能力)。
对预取路径及其存在方式有很好的解释:
http://www.llblgening.com/archive/2009/10/prefetchpaths-in-depth/
发布您其余的获取代码,我也许可以给您更准确的答案。
关于c# - llblgen 2.6 中相关字段的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6507940/