2012-09-05 15 views
5

प्रकार का निरंतर मान बनाने में असमर्थ इसने मुझे आज समस्याओं का कोई अंत नहीं किया है। मैं इस सरल प्रश्नइकाई फ्रेमवर्क: 'System.Collections.Generic.IList`1'

var result = 
    DataContext.Accommodations.Where(a => 
     (criteria.MinPrice == null || a.AccommodationRates.Any(r => r.From >= criteria.MinPrice)) && 
     (criteria.MaxPrice == null || a.AccommodationRates.Any(r => r.To <= criteria.MaxPrice)) && 
     (criteria.Locations == null || criteria.Locations.Count == 0 || a.AccommodationPlaceJoins.Any(j => criteria.Locations.Contains(j.Place.PlaceName))) 
); 

इस क्वेरी की अंतिम पंक्ति मुझे समस्याओं

(criteria.Locations == null || 
criteria.Locations.Count == 0 || 
a.AccommodationPlaceJoins.Any(j => criteria.Locations.Contains(j.Place.PlaceName))) 

त्रुटि यह देता है खड़ी कर रहा है है

प्रकार की एक निरंतर मूल्य बनाने के लिए 'में असमर्थ System.Collections.Generic.IList`1 '। इस संदर्भ में केवल आदिम प्रकार (जैसे इंट 32, स्ट्रिंग, और ग्विड ') समर्थित हैं।

मैं भी एक सूची बनाने की कोशिश नहीं कर रहा हूं। मैं यहां बस इतना करने की कोशिश कर रहा हूं कि ऐसी जगहें वापस लाएं जो किसी स्थान से जुड़े हों (जहां प्लेस टेबल में स्थान का नाम जो आवास तालिका से आवास आवास से जुड़ा हुआ है) आवास मानदंड जॉइन टेबल के माध्यम से आवास तालिका से जुड़ा हुआ है) मानदंडों में किसी भी स्थान के नाम के बराबर है झुकाव (जो कि प्रकार के प्रकार का है)।

मैंने इस लाइन को बदलने की कोशिश की है, लेकिन यह काम नहीं किया।

(criteria.Locations == null || 
criteria.Locations.Count == 0 || 
a.AccommodationPlaceJoins.Any(j => criteria.Locations.Any(l => l == j.Place.PlaceName))) 

उत्तर

29

निरंतर मूल्य एफई नहीं बना सकते तुलना criteria.Locations == null के लिए null है।

BTW

var result = DataContext.Accommodations.Where(a => 
    (criteria.MinPrice == null || 
     a.AccommodationRates.Any(r => r.From >= criteria.MinPrice)) && 
    (criteria.MaxPrice == null || 
     a.AccommodationRates.Any(r => r.To <= criteria.MaxPrice))); 

if (criteria.Locations != null && criteria.Locations.Count > 0) 
{ 
    result = result.Where(a => a.AccommodationPlaceJoins 
     .Any(j => criteria.Locations.Contains(j.Place.PlaceName))); 
} 

संपादित करें:: तुम कितने तरह दो मामलों में क्वेरी को विभाजित करने और क्वेरी के बाहर खाली सूची के लिए चेक करते हैं, उदाहरण के लिए की जरूरत है पूरे क्वेरी लिखना यह होगा मेरी राय में बेहतर पठनीय और SQL को सरल बनाना होगा जिसे डेटाबेस में भेजा जाना है:

IQueryable<Accommodation> result = DataContext.Accommodations; 

if (criteria.MinPrice != null) 
    result = result.Where(a => a.AccommodationRates 
     .Any(r => r.From >= criteria.MinPrice)); 

if (criteria.MaxPrice != null) 
    result = result.Where(a => a.AccommodationRates 
     .Any(r => r.To <= criteria.MaxPrice)); 

if (criteria.Locations != null && criteria.Locations.Count > 0) 
    result = result.Where(a => a.AccommodationPlaceJoins 
     .Any(j => criteria.Locations.Contains(j.Place.PlaceName))); 
+0

वाह, क्या एक अच्छा जवाब है। बहुत - बहुत धन्यवाद। मैं पूछताछ की इतनी गलत लाइनों नीचे चला गया। धन्यवाद +1 और स्वीकृत उत्तर और पसंदीदा प्रश्न। कोई आश्चर्य नहीं कि आपके पास लगभग 2 9 के अंक हैं। वैसे भी ऐसा क्यों होता है? –

+0

मैं आपके पठनीयता सुझाव के साथ लाइन में दोबारा प्रतिक्रिया कर रहा हूं। धन्यवाद। –

+1

@SachinKainth: अपवाद होता है क्योंकि LINQ से इकाइयों में एक क्वेरी में प्रत्येक अभिव्यक्ति और अभिव्यक्ति खंड SQL में अनुवाद योग्य होना चाहिए। तुलना 'मानदंड। स्थान == नल' क्लाइंट (= .NET) पक्ष पर नहीं किया जाता है, बल्कि इसके बजाय ईएफ इसे एसक्यूएल में भी अनुवाद करना चाहता है और फिर डेटाबेस को तुलना करना चाहिए। लेकिन डेटाबेस को नहीं पता कि .NET/CLR ऑब्जेक्ट संदर्भों की तुलना कैसे करें, यह केवल 'NULL' के लिए स्ट्रिंग, int इत्यादि जैसे आदिम प्रकारों को देख सकता है। एसक्यूएल में कोई अनुवाद संभव नहीं है या समर्थित -> अपवाद। – Slauma