2011-01-24 48 views
5

Tôi có một số mã mà có thể lấy tất cả các đơn vị có chứa một mối quan hệ đặc biệt, như vậy:Làm cách nào để lọc ra các thực thể KHÔNG có quan hệ nhiều-nhiều, sử dụng LLBLGen Pro?

 var bucket = new RelationPredicateBucket(); 
     bucket.Relations.Add(MessageEntity.Relations.MessageTemplateReferenceEntityUsingMessageId); 
     var messageEntities = new EntityCollection<MessageEntity>(); 
     using (var myAdapter = PersistenceLayer.GetDataAccessAdapter()) 
     { 
      myAdapter.FetchEntityCollection(messageEntities, bucket); 
     } 

Các công trình lớn. Bây giờ, tôi muốn nhận tất cả các thực thể trong bảng Message mà không có một hàng tương ứng trong bảng MessageTemplate xref. Đó là, nơi MessageEntity.Relations.MessageTemplateReferenceEntityUsingMessageId là null/false/nonexistent.

Dưới đây là một hack hiện tượng rằng một trong những đồng đội của tôi đã làm để làm cho công việc này cách đây vài năm (bộ sưu tập thực thể các mã trên là trong templatedMessages dưới đây):

bucket.PredicateExpression.Add(MessageFields.Id 
!= templatedMessages.Select(m => 
m.Id).ToArray()); 

Điều này thực sự làm việc, cho đến gần đây khi số của templatedMessages trong bảng đã vượt quá 2100, và phương pháp bắt đầu ném những ngoại lệ này:

Luồng giao thức cuộc gọi thủ tục từ xa (TPC) luồng đến (TPC) không chính xác. Có quá nhiều tham số được cung cấp trong yêu cầu RPC này. Tối đa là 2100.

Rõ ràng, chuyển SQL danh sách đầy đủ các ID mà bạn nên tránh không hiệu quả khủng khiếp. Cách tốt nhất để làm điều này trong LLBLGen là gì? Trong SQL tôi sẽ làm một cái gì đó như:

SELECT m.* FROM Message m 
WHERE NOT EXISTS (SELECT 1 FROM MessageTemplate mt WHERE mt.MessageID = m.ID) 

Tôi có thể làm điều này trong LLBLGen?

Trả lời

3

Sử dụng một FieldCompareSetPredicate:

http://www.llblgen.com/documentation/2.6/hh_goto.htm#Using%20the%20generated%20code/Adapter/Filtering%20and%20Sorting/gencode_filteringpredicateclasses_adapter.htm#FieldCompareSetPredicate

Cập nhật bởi ssmith: này đặt tôi trên con đường đúng đắn - đây là mã thực tế tôi đã kết thúc sử dụng để có được những hành vi mong muốn của tất cả các hàng tin rằng là không có trong bảng MessageTemplateReference xref:

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

Biến boolean cuối cùng phủ nhận Exists.

Các vấn đề liên quan