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

よく働く。ここで、MessageTemplate外部参照テーブルに対応する行がないMessageテーブルのすべてのエンティティを取得したいと思います。つまり、MessageEntity.Relations.MessageTemplateReferenceEntityUsingMessageIdがnull / false/nonexistentである場合です。

これは、私のチームメートの1人が数年前にこの作業を行うために行った驚異的なハックです(上記のコードのエンティティコレクションは、以下の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外部参照テーブルにないすべてのメッセージ行の目的の動作を取得するために使用した実際のコードです。

bucket.PredicateExpression.Add(
  new FieldCompareSetPredicate(
    MessageFields.Id, 
    null, 
    MessageTemplateReferenceFields.MessageId, 
    null,
    SetOperator.Exist,  
    (MessageFields.Id == MessageTemplateReferenceFields.MessageId), 
    true));

最後のブール値はExistsを否定します。

于 2011-01-24T21:48:54.373 に答える