代码之家  ›  专栏  ›  技术社区  ›  edosoft

使用llblgen将同一个表连接多次

  •  1
  • edosoft  · 技术社区  · 14 年前

    我有一张桌子,我们称之为widget,其中包括person1id和person2id。(是的,我想我应该设置一个n-n关系表,但到目前为止,在一个widget上的人数从未超过2人。)

    person1id(当然还有person2id)通过yes链接到person表,另一个链接链接到persondetail表。

    如何查询包含2个人和2个人详细信息的窗口小部件列表,并过滤个人详细信息字段?如果我的小工具中只有一个人ID,我会这样做:

    RelationCollection relationsToUse = new RelationCollection();
    relationsToUse.Add(WidgetEntity.Relations.PersonEntityUsingPerson1Id);
    relationsToUse.Add(PersonEntity.Relations.PersonDetailsEntityUsingDetailId);
    PredicateExpression filter = new PredicateExpression(new FieldCompareValuePredicate(PersonDetailsFields.ModifiedDate, ComparisonOperator.GreaterEqual, startdate)); //whatever
    var list = new WidgetCollection();
    list.GetMulti(filter, relationsToUse);
    

    那么,我该如何处理第二个关系呢? relationsToUse.Add(WidgetEntity.Relations.PersonEntityUsingPerson2Id); ?

    我用的是llblgen 2.6和.net 3.5。我确实看到了相关的问题 here 但情况不同。

    1 回复  |  直到 10 年前
        1
  •  2
  •   Matt Roberts    14 年前

    您只需要为您添加的每个关系指定一个别名-如果我记得正确的话,在llblgen文档文件中有一些关于这个的内容。

    这是从llblgen 2.6文档中获取的,对于“高级筛选”,您可以看到如何两次联接到同一个表,并使用别名控制筛选:

    …解决方案是对添加到RelationCollection的关系中的实体进行别名,并在谓词中使用相同的别名。如果省略别名,则认为它没有别名;如果在先前添加的关系中为同一个RelationCollection的某个实体添加了别名,则在联接列表中将它视为另一个实体。因此,在第一个关系中将客户别名为“c”,而在第二个关系中,如果不为客户指定别名,则在联接列表中会得到一个客户实体的2倍。所以小心使用别名。

    我们使用两个城市谓词的客户和两个地址实体的示例将产生以下代码。注意谓词中的别名用法。

    // C#
    IRelationPredicateBucket bucket = new RelationPredicateBucket();
    bucket.Relations.Add(CustomerEntity.Relations.AddressEntityUsingVisitingAddressID, "VisitingAddress");
    bucket.Relations.Add(CustomerEntity.Relations.AddressEntityUsingBillingAddressID, "BillingAddress");
    bucket.PredicateExpression.Add((AddressFields.City.SetObjectAlias("VisitingAddress")=="Amsterdam") &
         (AddressFields.City.SetObjectAlias("BillingAddress")=="Rotterdam"));
    EntityCollection customers = new EntityCollection(new CustomerEntityFactory());
    DataAccessAdapter adapter = new DataAccessAdapter();
    adapter.FetchEntityCollection(customers, bucket);