【问题标题】:How do I filter out entities that are NOT in a many-to-many relationship using LLBLGen Pro?如何使用 LLBLGen Pro 过滤掉不在多对多关系中的实体?
【发布时间】:2011-06-14 19:42:51
【问题描述】:

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

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

这是几年前我的一个队友为了完成这项工作而做的一个惊人的 hack(上面代码的实体集合在下面的 templatedMessages 中):

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

这确实有效,直到最近表中的 templatedMessage 数量超过 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 中执行此操作吗?

【问题讨论】:

    标签: llblgenpro llblgen


    【解决方案1】:

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

    最后一个布尔值否定 Exists。

    【讨论】:

      猜你喜欢
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多