【问题标题】:Join multiple times to the same table using LLBLGen使用 LLBLGen 多次加入同一个表
【发布时间】:2011-05-06 20:40:18
【问题描述】:

我有一张桌子,我们称之为 Widget,其中包含 person1id 和 person2id。 (是的,我想我应该设置一个 N-N 关系表,但到目前为止,我们在一个小部件上从来没有超过 2 个人。)

Person1Id(当然还有 person2id)链接到一个人表,另一个链接到一个 PersonDetail 表。

如何查询包含 2 个人员和 2 个人员详细信息的小部件列表,并在人员详细信息字段上进行过滤?如果我的小部件中只有一个 personid,我会这样做:

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,但它不一样。

【问题讨论】:

    标签: c# .net llblgenpro llblgen


    【解决方案1】:

    您只需要为您添加的每个关系指定一个别名 - 如果我没记错的话,LLBLGen doc 文件中有一些关于此的内容。

    这取自 LLBLGen 2.6 文档,对于“高级过滤”,您可以看到如何两次加入同一个表并使用别名来控制您的过滤器:

    ...解决方案是为添加到 RelationCollection 的关系中的实体设置别名,并在谓词中使用相同的别名。如果省略别名,则将其视为未别名,并且如果您已将先前添加的关系中的实体别名为同一 RelationCollection,则它将被视为连接列表中的不同实体。因此,在第一个关系中将客户别名为“C”,而在第二个关系中,您没有为客户指定别名,您将在连接列表中获得 2 次客户实体。所以请谨慎使用别名。

    我们的 Customer 示例和具有两个 City 谓词的两个 Address 实体将产生以下代码。请注意谓词中的别名用法。

    // 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);
    

    【讨论】:

    • 我确实通过编写存储过程来解决这个问题,但我仍然对解决方案感兴趣,所以如果它不是太麻烦的话......
    猜你喜欢
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    相关资源
    最近更新 更多