2

我继承了一个使用 llblgen 2.6 的应用程序。我有一个具有 AppointmentType 属性(n:1 关系)的 PersonAppointmentType 实体。现在我想根据 AppointmentType 的名称对 PersonAppointmentTypes 的集合进行排序。到目前为止,我在 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));
    }
4

1 回答 1

3

如果您想要一个确切的解决方案,您将需要共享更多代码。您没有在实际获取实体(或集合)的位置发布代码。这可能看起来不相关,但它(可能)是,因为我猜你犯了一个常见的错误,人们在第一次尝试对相关实体进行排序或过滤时使用预取路径。

您有从 PersonAppointmentType (PAT) 到 ApppointType (AT) 的预取路径。这基本上告诉框架将 PAT 作为一个查询来获取,然后在该查询完成后,根据 PAT 查询的结果来获取 AT。LLBLGen 会为您处理所有这些,并在查询完成后将对象连接在一起。

您要做的是按您在第二个查询中获取的实体对第一个查询进行排序。如果您用 SQL 术语思考,则需要在第一个查询中从 PAT=>AT 进行连接。为此,您需要通过 RelationPredicateBucket 添加关系(连接)并将其作为 fetch 调用的一部分传递。

乍一看似乎违反直觉,但关系和预取路径完全不相关(尽管您可以将它们一起使用)。您甚至可能根本不需要预取路径;可能您只需要将关系和排序子句添加到您的获取代码中(取决于您是否真的想要图形中的 AT实体,而不是按其字段排序的能力)。

对 Prefetch Paths 以及它们是如何出现的有一个很好的解释:

http://www.llblgening.com/archive/2009/10/prefetchpaths-in-depth/

发布您提取代码的其余部分,我可能会给您一个更准确的答案。

于 2011-06-28T19:08:53.893 回答