gpt4 book ai didi

llblgenpro - 如何使用 LLBLGen Pro 过滤掉不在多对多关系中的实体?

转载 作者:行者123 更新时间:2023-12-04 20:56:10 27 4
gpt4 key购买 nike

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

        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) 协议(protocol)流不正确。此 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 中执行此操作吗?

最佳答案

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

最后一个 bool 值否定存在。

关于llblgenpro - 如何使用 LLBLGen Pro 过滤掉不在多对多关系中的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4787483/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com