我有一些代码能够检索包含特定关系的所有实体,如下所示:
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 中执行此操作吗?