5

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

        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 为空/假/不存在。

这是几年前我的一个队友为了完成这项工作而做的一个惊人的 hack(上面代码的实体集合在下面的 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 中执行此操作吗?

4

1 回答 1

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

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

于 2011-01-24T21:48:54.373 回答