使用LLBLGen多次连接到同一个表

时间:2010-11-08 19:51:33

标签: c# .net llblgenpro llblgen

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

Person1Id(当然还有person2id)链接到person表,其中是另一个指向PersonDetail表的链接。

如何查询包含2个人和2个人详细信息的小部件列表,过滤个人领域?如果我在我的小部件中只有一个人,我会这样做:

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

我正在使用带有.net 3.5的LLBLgen 2.6。我确实看到了相关问题here,但它不一样。

1 个答案:

答案 0 :(得分:2)

你只需要为你添加的每个关系指定一个别名 - 如果我没记错的话,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);