2010-11-08 17 views
1

J'ai une table, appelons-la Widget, avec (entre autres) person1id et person2id. (Oui, je suppose que j'aurais dû configurer une table de relations NN, mais jusqu'à présent nous n'avons jamais plus de 2 personnes sur un même widget.)Joindre plusieurs fois à la même table en utilisant LLBLGen

Person1Id (et person2id bien sûr) sont liés à une table de personne avec un autre oui lien vers une table PersonDetail.

Comment puis-je interroger une liste de Widgets avec 2 personnes et 2 interlignes, en filtrant sur un champ de relation? Si j'avais juste un personnage dans mon widget je ferais:

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

Alors, comment puis-je obtenir la deuxième relation? relationsToUse.Add(WidgetEntity.Relations.PersonEntityUsingPerson2Id);? Je utilise LLBLgen 2.6 avec .net 3.5. J'ai vu la question connexe here mais ce n'est pas la même chose.

Répondre

2

Vous avez juste besoin de spécifier un alias pour chacune des relations que vous ajoutez - si je me souviens bien il y a quelque chose dans le fichier doc LLBLGen qui en parle.

Il est récupéré à partir des LLBLGen 2.6 docs, pour « filtrage avancé », vous pouvez voir comment rejoindre sur la même table deux fois et utiliser des alias pour contrôler vos filtres:

... La solution est d'alias les entités de la relation ajoutées à RelationCollection, et aussi d'utiliser le même alias dans un prédicat. Si vous omettez un alias, il est considéré comme non aliasé et si vous avez aliasé une entité dans une relation ajoutée antérieure au même RelationCollection, il sera considéré comme une entité différente dans la liste des jointures. Donc, aliassant le client à "C" dans la première relation et dans la deuxième relation, vous ne spécifiez pas d'alias pour le client, vous obtiendrez 2 fois une entité client dans la liste des jointures. Alors utilisez aliassing avec soin.

Notre exemple de Client et les deux entités Adresse avec les deux prédicats Ville généreront le code suivant. Notez également l'utilisation des alias dans les prédicats.

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

j'ai travaillé autour du problème en écrivant un sproc, mais je suis toujours intéressé par la solution si ce n'est pas trop de problèmes .... – edosoft

+0

éditera ma réponse –

+0

Sweet! Merci beaucoup – edosoft