2012-03-19 11 views
6

कारण बनता है। मैं उपयोगकर्ता द्वारा दर्ज मानदंडों के आधार पर एक अभिव्यक्ति बनाने के लिए:सशर्त ऑपरेटर मैं एक ASP.NET MVC 2 आवेदन में खोज की कार्यक्षमता को लागू करने की कोशिश कर रहा हूँ NHibernate अपवाद

public ViewResult FindCustomer(string forename, string familyname, DateTime? dob) 
    { 
    Expression<Func<Customer, bool>> searchCriteria = p => (
                  forename.IsNullOrEmpty() ? true : p.Forename == forename 
                  && familyname.IsNullOrEmpty() ? true : p.FamilyNames.Any(n => n.Name == familyname) 
                  && dob.HasValue ? true : p.DOB == dob 
                  ); 

तो भंडार में एक विधि के लिए पारित हो जाता है जो

IQueryable<Customer> customers = CustomerRepository.FilterBy(searchCriteria); 

समस्या जब मैं इस चलाने मैं निम्न अपवाद प्राप्त है

System.InvalidCastException: Unable to cast object of type 'NHibernate.Hql.Ast.HqlCast' to type 'NHibernate.Hql.Ast.HqlBooleanExpression' 

this के अनुसार समस्या अभिव्यक्ति में सशर्त ऑपरेटर का उपयोग है।

तो मैं मैं अभिव्यक्ति किसी अन्य तरीके से बनाने के लिए लगता है, लेकिन मुझे लगता है कि कैसे करना है यकीन नहीं है। मैं लिंक के लिए काफी नया हूं इसलिए किसी भी मदद की आभारी रूप से स्वीकार की जाएगी!

उत्तर

9

गतिशील रूप से आपकी क्वेरी बनाने के बारे में क्या? इस तरह:

var customers = CustomerRepository.AllEntities(); 

if (!forename.IsNullOrEmpty()) 
    customers = customers.Where(p => p.Forename == forename); 
if (!familyname.IsNullOrEmpty()) 
    customers = customers.Where(p => p.FamilyNames.Any(n => n.Name==familyname)); 
if (dob.HasValue) 
    customers = customers.Where(p => p.DOB == dob); 

मुझे नहीं पता कि यह काम करता है लेकिन मुझे लगता है कि यह अधिक कुशल हो सकता है।

+0

यह काम करता है! बहुत बहुत धन्यवाद। मैं ऐसा कुछ लिखने से बचने की कोशिश कर रहा था क्योंकि मैं डेटाबेस में कई कॉल से बचना चाहता था इसलिए मैंने सोचा कि मुझे एक ही अभिव्यक्ति बनाने की आवश्यकता है जिसमें सभी पैरामीटर शामिल हैं। आपके समाधान का उपयोग केवल एक एकल SQL कथन निष्पादित करता है। क्या यह NHibernate की एक विशेषता है? यह डेटाबेस में कॉल को कम करने के लिए एकाधिक LINQ अभिव्यक्तियों से SQL कथन बनाता है? मुझे लगता है कि मुझे एनएचबेर्नेट और LINQ दोनों के बारे में अधिक जानने की जरूरत है! – Babakoto

+1

@ बाबाकोटो यह LINQ की एक विशेषता है। आपकी क्वेरी का मूल्यांकन तब तक नहीं किया जाएगा जब तक कि आप अपनी 'IQueryable' श्रृंखला के अंत में' ToList' या 'SingleOrDefault' (या समान) विधि को कॉल न करें, ताकि आप अपनी क्वेरी में गतिशील रूप से कोई भी फ़िल्टर जोड़ सकें। एक स्पष्ट कॉल के बाद क्वेरी प्रोसेसर (जैसे NHibernate) पूरी क्वेरी श्रृंखला को SQL अभिव्यक्ति में बदल देगा। –

+0

यह बढ़िया है। आपकी मदद के लिए धन्यवाद फिर से – Babakoto