我有一些代码能够检索包含特定关系的所有实体,如下所示:
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中执行此操作吗?
答案 0 :(得分:3)
使用FieldCompareSetPredicate:
由ssmith更新: 这让我走上了正确的道路 - 这是我最终使用的实际代码,用于获取不在MessageTemplateReference外部参照表中的所有Message行的所需行为:
bucket.PredicateExpression.Add(
new FieldCompareSetPredicate(
MessageFields.Id,
null,
MessageTemplateReferenceFields.MessageId,
null,
SetOperator.Exist,
(MessageFields.Id == MessageTemplateReferenceFields.MessageId),
true));
最后一个布尔值否定存在。