Несколько раз присоединиться к одной и той же таблице с помощью LLBLGen - PullRequest
1 голос
/ 08 ноября 2010

У меня есть таблица, пусть она называется 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.Я видел соответствующий вопрос здесь , но это не то же самое.

1 Ответ

2 голосов
/ 24 ноября 2010

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

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

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

В нашем примере Customer и двух объектов Address с двумя предикатами City будет приведен следующий код. Обратите внимание на использование псевдонима в предикатах.

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