次のように、特定の関係を含むすべてのエンティティを取得できるコードがあります。
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でこれを行うことはできますか?