2009-06-23 7 views
31

मैं NHibernate का उपयोग कर रहा है और एक नामित क्वेरी के माध्यम से एक संग्रहीत प्रक्रिया बुला:सी # निरर्थक मूल्य टाइप किए गए मान एनआईवीबर्ननेट नामक IQuery पैरामीटर पर कैसे सेट किए जा सकते हैं?

संग्रहीत प्रक्रिया मापदंडों के
<sql-query name="SearchStuff" read-only="true" cacheable="true"> 
    <return class="ResultEntity" /> 
    EXEC [SearchStuff] ?, ?, ? </sql-query> 

कई जानबूझ कर व्यर्थ कर रहे हैं - यह बदला नहीं जा सकता।

सी #:

public static class QueryExtensions 
{ 
    public static void SetInt32(this IQuery query, int position, int? val) 
    { 
     if (val.HasValue) 
     { 
      query.SetInt32(position, val.Value); 
     } 
     else 
     { 
      query.SetParameter(position, null); 
     } 
    } 

    public static void SetInt32(this IQuery query, string name, int? val) 
    { 
     if (val.HasValue) 
     { 
      query.SetInt32(name, val.Value); 
     } 
     else 
     { 
      query.SetParameter(name, null); 
     } 
    } 

    public static void SetDateTime(this IQuery query, int position, DateTime? val) 
    { 
     if (val.HasValue) 
     { 
      query.SetDateTime(position, val.Value); 
     } 
     else 
     { 
      query.SetParameter(position, null); 
     } 
    } 

    public static void SetDateTime(this IQuery query, string name, DateTime? val) 
    { 
     if (val.HasValue) 
     { 
      query.SetDateTime(name, val.Value); 
     } 
     else 
     { 
      query.SetParameter(name, null); 
     } 
    } 
} 

मैं कोशिश की है:

IQuery listQuery = this.Session.GetNamedQuery("SearchStuff"); 
listQuery.SetInt32(0, param1); 
listQuery.SetDateTime(1, param2); 
listQuery.SetString(2, param3); 
IList<ResultEntity> results = listQuery.List<ResultEntity>(); 

दुर्भाग्य से, NHibernate किसी भी SetXyz प्रदान नहीं करता है() नल मूल्य प्रकार के लिए तरीकों तो मैं क्षतिपूर्ति करने के लिए कुछ विस्तार विधियां जोड़ने की कोशिश की इनमें से विभिन्न संस्करण लेकिन कोई काम नहीं। कोड ऊपर त्रुटि के साथ विफल:

System.ArgumentNullException : A type specific Set(position, val) should be called because the Type can not be guessed from a null value. 

मैं भी करने की कोशिश की बस पैरामीटर नहीं लेकिन NHibernate हर पैरामीटर सेट किया हुआ हो। मैंने एक ही परिणाम के साथ दोनों स्थितित्मक और नामित संस्करणों का उपयोग करने की कोशिश की है।

क्या NHibernate नामित प्रश्नों में टाइप किए गए मानकों को मानने के लिए शून्य मान असाइन करने का कोई तरीका है?

उत्तर

50

ठीक है, यह पता चला है कि सेट पैरामीटर पर कुछ ओवरराइड हैं जो प्रकार को स्पष्ट रूप से सेट करने की अनुमति देते हैं। उदाहरण के लिए: अब कर रहे हैं

public static class QueryExtensions 
{ 
    public static void SetInt32(this IQuery query, int position, int? val) 
    { 
     if (val.HasValue) 
     { 
      query.SetInt32(position, val.Value); 
     } 
     else 
     { 
      query.SetParameter(position, null, NHibernateUtil.Int32); 
     } 
    } 

    public static void SetInt32(this IQuery query, string name, int? val) 
    { 
     if (val.HasValue) 
     { 
      query.SetInt32(name, val.Value); 
     } 
     else 
     { 
      query.SetParameter(name, null, NHibernateUtil.Int32); 
     } 
    } 

    public static void SetDateTime(this IQuery query, int position, DateTime? val) 
    { 
     if (val.HasValue) 
     { 
      query.SetDateTime(position, val.Value); 
     } 
     else 
     { 
      query.SetParameter(position, null, NHibernateUtil.DateTime); 
     } 
    } 

    public static void SetDateTime(this IQuery query, string name, DateTime? val) 
    { 
     if (val.HasValue) 
     { 
      query.SetDateTime(name, val.Value); 
     } 
     else 
     { 
      query.SetParameter(name, null, NHibernateUtil.DateTime); 
     } 
    } 
} 
+0

कि के लिए धन्यवाद, मेरी मदद करो :) – RhysC

+3

आप तरीकों आप भी चेनिंग सही है, जैसे मिल से क्वेरी वस्तु वापस लौटाते हैं: सार्वजनिक स्थिर IQuery SetDateTime (... ... retrun क्वेरी; –

+0

ठोस एक्सटेंशन –

3

पूर्ण विस्तार तरीकों (Int32 और दिनांक समय के लिए) श्रृंखलन के साथ:

query.SetParameter(position, null, NHibernateUtil.Int32); 

पूर्ण विस्तार तरीकों (Int32 और दिनांक समय के लिए) अब कर रहे हैं

public static class QueryExtensions 
{ 
    public static IQuery SetInt32(this IQuery __query, int __position, int? __val) 
    { 
     var _query = __val.HasValue ? __query.SetInt32(__position, __val.Value) : __query.SetParameter(__position, null, NHibernateUtil.Int32); 

     return _query; 
    } 

    public static IQuery SetInt32(this IQuery __query, string __name, int? __val) 
    { 
     var _query = __val.HasValue ? __query.SetInt32(__name, __val.Value) : __query.SetParameter(__name, null, NHibernateUtil.Int32); 

     return _query; 
    } 

    public static IQuery SetDateTime(this IQuery __query, int __position, DateTime? __val) 
    { 
     var _query = __val.HasValue ? __query.SetDateTime(__position, __val.Value) : __query.SetParameter(__position, null, NHibernateUtil.DateTime); 

     return _query; 
    } 

    public static IQuery SetDateTime(this IQuery __query, string __name, DateTime? __val) 
    { 
     var _query = __val.HasValue ? __query.SetDateTime(__name, __val.Value) : __query.SetParameter(__name, null, NHibernateUtil.DateTime); 

     return _query; 
    } 
} 
+0

धन्यवाद, रैब्रॉक, उपरोक्त एक्सटेंशन में इस अतिरिक्त के लिए। यह वही है जो मुझे चाहिए। :) –

10

एक और तरीका है इसे पूरा करने के लिए है:

query.SetParameter<int?>(0, null); 
query.SetParameter<DateTime?>(1, null); 
... 

और इतने पर ...

? प्रतीक पर ध्यान दें जो आदिम प्रकार को शून्य बनाता है।