2010-11-08 2 views
1

У меня есть таблица, пусть назовите ее Виджет, с (среди прочих) person1id и person2id. (Да, я полагаю, мне следовало бы установить таблицу отношений NN, но до сих пор у нас никогда не было более двух человек на одном виджетах.)Соедините несколько раз с той же таблицей, используя LLBLGen

Person1Id (и person2id конечно) связаны с таблицей человека, да еще ссылку на таблицу PersonDetail.

Как я могу запросить список виджетов с 2 людьми и 2 persondetails, фильтруя поле persondetail? Если бы у меня было только одно лицо в моем виджете, я бы сделал:

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, но это не то же самое.

ответ

2

Вам просто нужно указать псевдоним для каждого добавляемого вами отношения - если я правильно помню что-то в файле документа LLBLGen, который говорит об этом.

Это взято из LLBLGen 2.6 Docs, для «продвинутой фильтрации», вы можете увидеть, как присоединиться на одной и той же таблицы дважды и использовать псевдонимы, чтобы контролировать свои фильтры:

... Решение является псевдонимом сущности в отношении, добавленном к RelationCollection, а также использовать один и тот же псевдоним в предикате. Если вы опускаете псевдоним, он считается не псевдонимом, и если вы наложили псевдоним на ранее добавленную связь с тем же RelationCollection, он будет считаться другим объектом в списке соединений. Таким образом, слияния клиента с «C» в первом отношении, а во втором отношении вы не указываете псевдоним для Клиента, вы получите 2 раза объект Customer в списке соединений. Поэтому используйте aliassing с осторожностью.

Наш пример Customer и двух объектов 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); 
+0

Я работал вокруг этой проблемы, написав sproc, но я по-прежнему заинтересован в решении так, если это не слишком много проблем .... – edosoft

+0

будет редактировать мой ответ –

+0

Сладкого! Большое спасибо – edosoft

Смежные вопросы