2011-01-24 4 views
5

ho qualche codice che è in grado di recuperare tutte le entità che contengono un particolare rapporto, in questo modo:Come faccio a filtrare le entità che NON sono in una relazione molti-a-molti utilizzando 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); 
     } 

funziona alla grande. Ora, voglio ottenere tutte le entità nella tabella dei messaggi che NON hanno una riga corrispondente nella tabella xref di MessageTemplate. Ovvero, dove MessageEntity.Relations.MessageTemplateReferenceEntityUsingMessageId è null/false/inesistente.

Ecco un hack fenomenale che uno dei miei compagni di squadra hanno fatto per fare questo lavoro alcuni anni fa (collezione entità del codice di cui sopra è in templatedMessages sottostante):

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

Questo in realtà ha funzionato, fino a poco tempo quando il numero di templatedMessages nella tabella è cresciuto oltre 2100 e il metodo ha iniziato a generare queste eccezioni:

Il flusso di protocollo RPC (Remote Procedure Call) della trasmissione remota di dati tabulari (TDS) non è corretto. Troppi parametri sono stati forniti in questa richiesta RPC. Il massimo è 2100.

Ovviamente, passando SQL un elenco completo di ID che dovrebbe evitare non è terribilmente efficiente. Qual è il modo migliore per farlo in LLBLGen? In SQL vorrei fare qualcosa di simile:

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

Posso farlo in LLBLGen?

risposta

3

Utilizzare un FieldCompareSetPredicate:

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

attualizzato tramite ssmith: Questo mi mise sulla strada giusta - qui è il codice vero e ho finito per usare per ottenere il comportamento desiderato di tutte le righe dei messaggi che sono non nella tabella MessageTemplateReference riferimento esterno:

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

l'ultima booleano nega il esiste.