如何使用LLBLGen Pro过滤掉不属于多对多关系的实体?

时间:2011-01-24 21:40:45

标签: llblgenpro llblgen

我有一些代码能够检索包含特定关系的所有实体,如下所示:

        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表中的所有实体在MessageTemplate xref表中没有对应的行。也就是说,MessageEntity.Relations.MessageTemplateReferenceEntityUsingMessageId为null / false /不存在。

这是一个惊人的黑客攻击,我的一个队友几年前做过这项工作(上面代码的实体集合在下面的templatedMessages中):

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

这实际上有效,直到最近表中templatedMessages的数量增长到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中执行此操作吗?

1 个答案:

答案 0 :(得分: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外部参照表中的所有Message行的所需行为:

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

最后一个布尔值否定存在。