ssm*_*ith 5 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);
}
Run Code Online (Sandbox Code Playgroud)
效果很好.现在,我想让Message表中的所有实体在MessageTemplate xref表中没有对应的行.也就是说,MessageEntity.Relations.MessageTemplateReferenceEntityUsingMessageId为null/false /不存在.
这是一个惊人的黑客攻击,我的一个队友几年前做过这项工作(上面代码的实体集合在下面的templatedMessages中):
bucket.PredicateExpression.Add(MessageFields.Id
!= templatedMessages.Select(m =>
m.Id).ToArray());
Run Code Online (Sandbox Code Playgroud)
这实际上是有效的,直到最近表中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)
Run Code Online (Sandbox Code Playgroud)
我可以在LLBLGen中这样做吗?
使用 FieldCompareSetPredicate:
由 ssmith 更新:这让我走上了正确的道路 - 这是我最终用来获取不在 MessageTemplateReference 外部参照表中的所有消息行的所需行为的实际代码:
bucket.PredicateExpression.Add(
new FieldCompareSetPredicate(
MessageFields.Id,
null,
MessageTemplateReferenceFields.MessageId,
null,
SetOperator.Exist,
(MessageFields.Id == MessageTemplateReferenceFields.MessageId),
true));
Run Code Online (Sandbox Code Playgroud)
最后一个布尔值否定存在。