2010-02-21 15 views
5

में पूर्वानुमानित किया गया है, मैं शून्य संदर्भ अपवादों के बिना LINQ में भविष्यवाणी कहां स्थितियों को निर्दिष्ट कर सकता हूं। उदाहरण के लिए, यदि q एक IQueryable है कि कैसे मैं पसंद नहीं कर सकते हैं:जहां LINQ

Expression<Func<ProductEntity,bool>> predicate = p => !search.CategoryId.HasValue || (search.CategoryId.HasValue && search.CategoryId == p.CategoryId); 

var q2 = q.Where(predicate); 

यहाँ search एक वस्तु है कि संभव खोज की स्थिति या search.CategoryId की तरह सेट कर सकते हैं हो सकता है कि नहीं किया जा सेट नहीं किया जा सकता है रखती है, लेकिन अगर यह होता है मैं उन शर्तों को प्राप्त करना चाहता हूं जो उस स्थिति से निर्धारित हैं।

जब मैं ऐसा करता हूं तो मुझे शून्य संदर्भ अपवाद मिलते हैं।

उत्तर

7

आप डिफ़ॉल्ट मान के साथ संभावित शून्य मान को प्रतिस्थापित करने के लिए null-coalescing operator?? का उपयोग कर सकते हैं। निम्न सेट खोज से मेल खाने का प्रयास करते हैं। श्रेणी यदि यह मौजूद है या बस "हमेशा सत्य" अभिव्यक्ति बनाता है। यह किसी भी अच्छे लिंक क्वेरी प्रदाता (उदा। LinqToSql) द्वारा अनुकूलित किया जाएगा।

Expression<Func<ProductEntity,bool>> predicate = (p => (search.CategoryId ?? p.CategoryId) == p.CategoryId)); 

var q2 = q.Where(predicate); 

एक और संभावना को गतिशील एक प्रश्न विधेय PredicateBuilder का उपयोग कर रचना के लिए किया जाएगा।

Expression<Func<ProductEntity,bool> predicate = p => !search.CategoryId.HasValue 
     || (search.CategoryId.HasValue && search.CategoryId == p.CategoryId) 
var q2 = q.Where(predicate); 

तो कितने तरीकों से हम null समस्याओं प्राप्त कर सकते हैं:

var predicate = PredicateBuilder.True<Order>(); 

if (search.OrderId)) 
{ 
    predicate = predicate.And(a => SqlMethods.Like(a.OrderID, search.OderID); 
} 
// ... 
var results = q.Where(predicate); 
3

की लाइन काटना करते हैं: के रूप में आप का उपयोग इस तरह से मैं एक ऐसी ही पैटर्न के साथ खोजों के लिए यह करना है?

  • search (अपने "पर कब्जा कर लिया" चर) हो सकता है null
  • p बातिल हो सकता है, जिसका अर्थ है वहाँ सूची
  • आप संभाला हैsearch.CategoryId जा रहा है null के मामले में एक null (Nullable<T>)
  • लेकिन शायद p.CategoryId (सूची में रिकॉर्ड पर श्रेणी) null (Nullable<T>) - कैसे ver, मुझे यकीन है कि इस का कारण होता है एक NullReferenceException
  • q (सूची/स्रोत) null

तो हो सकता है नहीं कर रहा हूँ: 5 विकल्प आप 1 का सफाया कर दिया गया है से बाहर; दूसरे 4 को देखो? भी निश्चित संभावना है कि समस्या कोड में दिखाई देने वाली अदृश्य चीज़ के कारण नहीं होती है; उदाहरण के लिए get हो सकता है:

public int? CategoryId { 
    get {return innerObject.CategoryId;} 
} 

और innerObjectnull हो सकता है; यदि आप दूसरे 4 को खत्म करते हैं (करने में बहुत आसान), तो अंतिम उपाय के रूप में इसे देखें।

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