У меня есть некоторый код, который может извлечь все объекты, которые содержат определенные отношения, например так:
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?