2011-01-24 38 views
5

我有一些代碼,能夠檢索包含特定關係的所有實體,像這樣:如何使用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); 
     } 

的偉大工程。現在,我想要獲取Message表中沒有對應行的所有實體。也就是說,MessageEntity.Relations.MessageTemplateReferenceEntityUsingMessageId爲null/false /不存在。

這是一個驚人的黑客工具,我的一個隊友做,使這項工作在幾年前(上面的代碼中的實體集合是templatedMessages以下):

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

這實際工作,直到最近,當數表中的模板消息增長超過2100年,並且該方法開始拋出以下異常:

傳入的表格數據流(TDS)遠程過程調用(RPC)協議流不正確。此RPC請求中提供的參數太多。最大值爲2100.

很明顯,將SQL傳遞給它應該避免的完整ID列表並不是非常有效。在LLBLGen中做這件事的最好方法是什麼?在SQL我會做這樣的事情:

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

我可以在LLBLGen中做到這一點?

回答

3

使用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)); 

最後布爾否定存在。