2

我有一张桌子,我们称之为 Widget,其中包括 person1id 和 person2id。(是的,我想我应该设置一个 NN 关系表,但到目前为止,我们在一个小部件上从来没有超过 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 一起使用。我确实在这里看到了相关问题,但不一样。

4

1 回答 1

4

您只需要为您添加的每个关系指定一个别名 - 如果我没记错的话,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);
于 2010-11-24T09:58:45.867 回答