2011-08-23 8 views
6

PredicateBuilder के साथ मैं SQL में या क्वेरी में समान कार्यक्षमता कैसे प्राप्त करूं?सी # कार्यक्षमता बिल्डर के साथ "नहीं IN" कार्यक्षमता

उदाहरण के लिए मेरे पास आईडी की एक सूची है और मैं उन सभी लोगों को चुनना चाहता हूं जिनके आईडी या तो आईडी से मेल खाते हैं या मेल नहीं खाते हैं।

लोग मैच कार्यक्षमता काफी सरल

var predicate = PredicateBuilder.False<Person>() 
foreach (int i in personIDs) 
{ 
    int temp = i; 
    predicate = predicate.Or(e=>e.PersonID == temp); 
} 
return persons.Where(predicate); 

तो मैं कैसे विपरीत मिलता है (हालांकि वहाँ यह करने के लिए एक बेहतर तरीका हो सकता है) है? मैं उन सभी व्यक्तियों को चाहता हूं जिनके आईडी व्यक्ति सूची में नहीं हैं।

+0

एक कामकाज के रूप में मैं व्यक्तियों की सूची prefiltered की सूची प्राप्त करने में सक्षम था, इसलिए मैं उपरोक्त कोड का उपयोग कर सकते हैं। यह आदर्श नहीं है, लेकिन यह काम करेगा। –

उत्तर

3

De Morgan पूछें:

नहीं

(पी या क्यू) = (नहीं पी) और (नहीं क्यू)

अपने कोड करवाने के लिए एक नहीं हालत में, के रूप में फिर से लिखने के बराबर उत्पन्न

var predicate = PredicateBuilder.True<Person>() 

और

predicate = predicate.And(e=>e.PersonID != temp); 
+0

मैंने पहली बार कोशिश की, हालांकि मुझे एसक्यूएल से एक खाली परिणाम सेट मिल रहा है। जब मैं प्रोफाइलर से एसक्यूएल का निरीक्षण करता हूं तो मुझे के चयन के लिए कुछ मिलता है CAST (Varchar (1) के रूप में पूर्ण) [सी 1], के रूप में। । । से (एक्स के रूप में 1 चुनें) AS [सिंगलरोवटेबल 1] कहां 1 = 0 –

0

क्या यह आप चाहते हैं?

var predicate = PredicateBuilder.True<Person>() 
foreach (int i in personIDs) 
{ 
    int temp = i; 
    predicate = predicate.And(e => e.PersonID != temp); 
} 
return persons.Where(predicate); 
0

एपीआई को देखकर बिना ....

var predicate = PredicateBuilder.True<Person>() 
foreach (int i in personIDs) 
{ 
    int temp = i; 
    predicate = predicate.And(e=>e.PersonID != temp); 
} 
return persons.Where(predicate); 
3

आप इकाई की रूपरेखा का उपयोग करें? किसी SQL नहीं क्वेरी बनाई गई है इस LINQ बयान से

var personIds = new List<int>() { 8,9,10 }; 
var query = persons.Where(it => !personIds.Contains(it.PersonId)); 

:

तो फिर तुम PredicateBuilder बिना क्वेरी बना सकते हैं।

संबंधित मुद्दे