2009-04-27 7 views
8

मुझे व्यवसाय फ़िल्टर बाधा व्यक्त करने में सक्षम होने के लिए मानदंड एपीआई में वर्ष() और महीने() फ़ंक्शन का उपयोग करने की आवश्यकता है।एनएच मानदंड एपीआई में उपयोगकर्ता वर्ष() और महीने() फ़ंक्शन कैसे करें?

cri.Add(Expression.Ge("year(Duration.DateFrom)", Year.Value)); 
cri.Add(Expression.Le("year(Duration.DateTo)", Year.Value)); 

स्पष्ट रूप से काम नहीं करते - क्या कोई समाधान है इसे प्राप्त करने के लिए कोई समाधान है?

मैं जानता हूँ कि यह HQL में पूरी तरह से संभव है, लेकिन मैं मापदंड एपीआई का उपयोग कर क्वेरी के निर्माण के लिए क्वेरी छँटाई जोड़ने, पृष्ठन आदि के प्रसंस्करण के लिए कुछ अतिरिक्त प्रक्रियाओं वहाँ हो क्योंकि जरूरत है ..


नमूना HQL समाधान जो मैं मानदंड एपीआई को फिर से लिखना चाहता हूं:

var ym = year * 100 + month; 
var hql = ...(:ym between 100 * year(f.Duration.DateFrom) + month(f.Duration.DateFrom) and 100 * year(f.Duration.DateTo) + month(f.Duration.DateTo)"; 

उत्तर

8

यह इस लक्ष्य को हासिल करने के लिए संभव है Projections.SQLFunction का उपयोग कर। कार्य समाधान:

ISQLFunction sqlAdd = new VarArgsSQLFunction("(", "+", ")"); 
ISQLFunction sqlMultiply = new VarArgsSQLFunction("(", "*", ")"); 

var ym = Year.Value * 100 + Month.Value; 
var dateFromMonthProj = Projections.SqlFunction("month", NHibernateUtil.Int32, Projections.Property("PurchaseDuration.DateFrom")); 
var dateFromYearProj = Projections.SqlFunction("year", NHibernateUtil.Int32, Projections.Property("PurchaseDuration.DateFrom")); 
var dateToMonthProj = Projections.SqlFunction("month", NHibernateUtil.Int32, Projections.Property("PurchaseDuration.DateTo")); 
var dateToYearProj = Projections.SqlFunction("year", NHibernateUtil.Int32, Projections.Property("PurchaseDuration.DateTo")); 
var calculatedYMFrom = Projections.SqlFunction(sqlAdd, NHibernateUtil.Int32, Projections.SqlFunction(sqlMultiply, NHibernateUtil.Int32, dateFromYearProj, Projections.Constant(100)), dateFromMonthProj); 
var calculatedYMTo = Projections.SqlFunction(sqlAdd, NHibernateUtil.Int32, Projections.SqlFunction(sqlMultiply, NHibernateUtil.Int32, dateToYearProj, Projections.Constant(100)), dateToMonthProj); 
cri.Add(Restrictions.Le(calculatedYMFrom, ym)); 
cri.Add(Restrictions.Ge(calculatedYMTo, ym)); 
1

क्या यह आपके लिए कुछ काम करेगा?

cri.Add(Expression.Ge("Duration.DateFrom", new Date(fromYear, 1, 1)); 
cri.Add(Expression.Le("Duration.DateTo", new Date(toYear, 12, 31)); 

ध्यान दें कि मैं अपनी अभिव्यक्ति क्रम बदल - मैं तुम्हें लिखने में कोई त्रुटि मानते हुए हूँ और आप DateFrom और DateTo के बीच दिनांकों क्वेरी करना चाहते हैं।

cri.Add(Expression.Ge("Duration.DateFrom", new Date(fromYear, fromMonth, 1)); 
// Actual code needs to get last day of to month since it will not always be 31 
cri.Add(Expression.Le("Duration.DateTo", new Date(toYear, toMonth, 31)); 

"YYMM" के रूप में अपने उपयोगकर्ता इनपुट है:

cri.Add(Expression.Lt("Duration.DateTo", new Date(toYear + 1, 1, 1)); 

जवाब में टिप्पणी करने के लिए: दिनांक समय डेटा होते हैं, तो दूसरी अभिव्यक्ति करने के लिए बदल जाएगा? अगर ऐसी बात है, तो आप सिर्फ इतना है कि स्ट्रिंग से वर्ष और माह पार्स आउट कर fromYear, fromMonth, आदि बनाने के लिए

संपादित करें: मेरी 3 और अंतिम प्रयास:

// First parse the input, e.g: september 2009 into 9 (inMonth) and 2009 (inYear) 
var fromDate = new DateTime(inYear, inMonth, 1); 
var toDate = fromDate.AddMonths(1).AddDays(-1); 

cri.Add(Expression.Ge("Duration.DateFrom", fromDate)); 
cri.Add(Expression.Le("Duration.DateTo", toDate)); 
+0

यह दुर्भाग्य से पर्याप्त नहीं है। उपयोगकर्ता इनपुट वर्ष + महीने है और मुझे वर्ष + महीने के अंतराल की अवधि के साथ सभी वस्तुओं को वापस करने की आवश्यकता है। एचक्यूएल में सिममिलर समाधान इस तरह दिखता है: var ym = year * 100 + month; var hql = ... (: ym 100 * वर्ष (f.Duration.DateFrom) + महीने (f.Duration.DateFrom) और 100 * वर्ष (f.Duration.DateTo) + माह (f.Duration.DateTo) के बीच ym "; मैं समझने में सक्षम नहीं हूं कि मानदंड एपीआई का उपयोग करके एक ही प्रश्न कैसे बनाएं। – Buthrakaur

+0

संपादित करने के जवाब में: मेरे पास सिर्फ एक वर्ष + महीने का संयोजन है। उपयोगकर्ता की कहानी इस प्रकार है:" मुझे अवधि के साथ ऑब्जेक्ट दिखाएं सितंबर 200 9 को कवर करना "। मेरे पास ऑब्जेक्ट {DateFrom = new DateTime (2008,1,1), DateTo = new DateTime (2222, 1, 2)} हो सकता है और उपयोगकर्ता इनपुट" सितंबर 200 9 "है - आपका सुझाव यहां काम नहीं करता है । – Buthrakaur

0

मैं सुनिश्चित नहीं हूं मैं understod आप अपने प्रश्न के साथ क्या मतलब है, लेकिन मैं एक ऐसी ही सवाल था, और मैं के साथ समस्या हल:

crit.Add(Expression.Sql("(YEAR({alias}.ObsDatum) = ?)", year, NHibernateUtil.String)) 
crit.Add(Expression.Sql("(MONTH({alias}.ObsDatum) = ?)", manad, NHibernateUtil.Int32)) 
संबंधित मुद्दे