2011-01-24 2 views
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 xref तालिका में कोई समान पंक्ति नहीं है। यही वह जगह है, जहां MessageEntity.Relations.MessageTemplateReferenceEntityUsingMessageId शून्य/झूठी/nonexistent है।

यहां एक असाधारण हैक है कि मेरे साथियों में से एक ने कुछ साल पहले यह काम किया था (उपर्युक्त कोड का इकाई संग्रह टेम्पलेटेड मैसेज में है):

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

यह वास्तव में काम करता है, हाल ही में जब तक संख्या तालिका में टेम्पलेट मैसेज 2100 से अधिक हो गया, और विधि ने इन अपवादों को फेंकना शुरू कर दिया:

आने वाली टैब्यूलर डेटा स्ट्रीम (टीडीएस) रिमोट प्रोसेस कॉल (आरपीसी) प्रोटोकॉल स्ट्रीम गलत है। इस आरपीसी अनुरोध में बहुत सारे पैरामीटर प्रदान किए गए थे। अधिकतम 2100 है। Xzx45

स्पष्ट रूप से, SQL को गुजरने वाली आईडी की एक पूरी सूची जिसे इसे टालना चाहिए, वह बहुत कुशल नहीं है। एलएलबीएलजेन में ऐसा करने का सबसे अच्छा तरीका क्या है? एसक्यूएल में मैं कुछ ऐसा करूंगा:

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

क्या मैं इसे एलएलबीएलजेन में कर सकता हूं?

उत्तर

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 xref तालिका में नहीं:

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

अंतिम बूलियन मौजूदियों को अस्वीकार करता है।