que tienen un código que es capaz de recuperar todas las entidades que contienen una relación particular, así:¿Cómo puedo filtrar entidades que NO están en una relación muchos a muchos usando LLBLGen Pro?
var bucket = new RelationPredicateBucket();
bucket.Relations.Add(MessageEntity.Relations.MessageTemplateReferenceEntityUsingMessageId);
var messageEntities = new EntityCollection<MessageEntity>();
using (var myAdapter = PersistenceLayer.GetDataAccessAdapter())
{
myAdapter.FetchEntityCollection(messageEntities, bucket);
}
funciona muy bien. Ahora, quiero obtener todas las entidades en la tabla de mensajes que NO tienen una fila correspondiente en la tabla xRef de MessageTemplate. Es decir, donde MessageEntity.Relations.MessageTemplateReferenceEntityUsingMessageId es null/false/inexistente.
Aquí es un truco fenomenal que uno de mis compañeros de equipo hicieron para hacer este trabajo hace algunos años (colección de la entidad del código anterior es en templatedMessages abajo):
bucket.PredicateExpression.Add(MessageFields.Id
!= templatedMessages.Select(m =>
m.Id).ToArray());
En realidad, esto funcionó, hasta hace poco, cuando el número de templatedMessages en la tabla creció más allá de 2100, y el método comenzó a arrojar estas excepciones:
La secuencia de protocolo de llamada de procedimiento (RPC) remota de flujo de datos tabulares entrante es incorrecta. Se proporcionaron demasiados parámetros en esta solicitud de RPC. El máximo es 2100.
Obviamente, pasar SQL una lista completa de ID que debe evitar no es muy eficiente. ¿Cuál es la mejor manera de hacer esto en LLBLGen? En SQL, haría algo como:
SELECT m.* FROM Message m
WHERE NOT EXISTS (SELECT 1 FROM MessageTemplate mt WHERE mt.MessageID = m.ID)
¿Puedo hacer esto en LLBLGen?