Как отфильтровать объекты, которые НЕ находятся в отношениях «многие ко многим», используя LLBLGen Pro? - PullRequest
5 голосов
/ 25 января 2011

У меня есть некоторый код, который может извлечь все объекты, которые содержат определенные отношения, например так:

        var bucket = new RelationPredicateBucket();
        bucket.Relations.Add(MessageEntity.Relations.MessageTemplateReferenceEntityUsingMessageId);
        var messageEntities = new EntityCollection<MessageEntity>();
        using (var myAdapter = PersistenceLayer.GetDataAccessAdapter())
        {
            myAdapter.FetchEntityCollection(messageEntities, bucket);
        }

Отлично работает.Теперь я хочу получить все объекты в таблице сообщений, которые НЕ имеют соответствующей строки в таблице внешних ссылок MessageTemplate.То есть, когда MessageEntity.Relations.MessageTemplateReferenceEntityUsingMessageId имеет значение null / false / несуществующее.

Вот феноменальный хак, который один из моих товарищей по команде сделал, чтобы это работало несколько лет назад (коллекция сущностей вышеуказанного кода находится в templatedMessagesниже):

bucket.PredicateExpression.Add(MessageFields.Id
 != templatedMessages.Select(m =>
 m.Id).ToArray());

Это действительно работало до недавнего времени, когда число шаблонных сообщений в таблице превысило 2100, и метод начал выдавать следующие исключения:

Входящая таблицаПоток данных (TDS) Протокол протокола удаленного вызова процедур (RPC) неверен.Слишком много параметров было предоставлено в этом запросе RPC.Максимум - 2100.

Очевидно, что передача SQL полного списка идентификаторов, которых следует избегать, не слишком эффективна.Какой лучший способ сделать это в LLBLGen?В SQL я бы сделал что-то вроде:

SELECT m.* FROM Message m 
WHERE NOT EXISTS (SELECT 1 FROM MessageTemplate mt WHERE mt.MessageID = m.ID)

Могу ли я сделать это в LLBLGen?

1 Ответ

3 голосов
/ 25 января 2011

Используйте FieldCompareSetPredicate:

http://www.llblgen.com/documentation/2.6/hh_goto.htm#Using%20the%20generated%20code/Adapter/Filtering%20and%20Sorting/gencode_filteringpredicateclasses_adapter.htm#FieldCompareSetPredicate

Обновлено ssmith: Это поставило меня на правильный путь - вот фактический код, который я в конечном итоге использовал, чтобы получить желаемое поведение всехСтроки сообщений, которых нет в таблице внешних ссылок MessageTemplateReference:

bucket.PredicateExpression.Add(
  new FieldCompareSetPredicate(
    MessageFields.Id, 
    null, 
    MessageTemplateReferenceFields.MessageId, 
    null,
    SetOperator.Exist,  
    (MessageFields.Id == MessageTemplateReferenceFields.MessageId), 
    true));

Последнее логическое значение отрицает Exists.

...