2011-01-28 9 views
6

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

SELECT SUM(color_pages) * SUM(total_pages) 
FROM connector_log_entry 
GROUP BY department_name 

लेकिन मैं किसी भी गणित आपरेशन अनुमानों कहीं भी नहीं मिल सकता है (*)।

Session.QueryOver<ConnectorLogEntry>() 
     .SelectList(list => list 
      .SelectGroup(m => m.DepartmentName) 
      .WithAlias(() => dto.Department) 
      .Select(Projections.Sum<ConnectorLogEntry>(m => m.TotalPages)) 
      //.Select(Projections.Sum<ConnectorLogEntry>(m => m.ColorPages)) 
      .WithAlias(() => dto.TotalColorPercentage)) 
     .TransformUsing(Transformers.AliasToBean<DepartmentConsumption>()); 
+1

भले ही आप इसे आईसीआरटीरिया के साथ करने में सक्षम होंगे, एचक्यूएल क्वेरी अधिक पठनीय होगी। – Sly

उत्तर

8

अंकगणितीय ऑपरेटरों का उपयोग VarArgsSQLFunction एसक्यूएल फ़ंक्शन के माध्यम से मानदंड प्रश्नों में किया जा सकता है। अपने विशेष मामले में, कुछ इस तरह दिखेगा:

Session.QueryOver<ConnectorLogEntry>() 
    .SelectList(list => 
     list.SelectGroup(m => m.DepartmentName) 
      .WithAlias(() => dto.Department) 
      .Select(Projections.SqlFunction(
       new VarArgsSQLFunction("(", "*", ")"), 
       NHibernateUtil.Int32, 
       Projections.Sum<ConnectorLogEntry>(m => m.TotalPages), 
       Projections.Sum<ConnectorLogEntry>(m => m.ColorPages))) 
      .WithAlias(() => dto.TotalColorPercentage)) 
    .TransformUsing(Transformers.AliasToBean<DepartmentConsumption>()); 

इस तकनीक को सीधे उत्पन्न एसक्यूएल में तार injects, ताकि आप सुनिश्चित अंतर्निहित डेटाबेस ऑपरेटरों आप का उपयोग का समर्थन करता है बनाने की आवश्यकता होगी।

+0

मेरे पास यह जांचने का एक त्वरित तरीका नहीं है कि यह समाधान 100% अच्छा है, लेकिन VarArgsSQLFunction क्लास प्रलेखन को देखकर मुझे पूरा यकीन है कि यह वही है जो मैं साल पहले और अधिक खोज रहा हूं :) आशा है कि यह उत्तर भविष्य में दूसरों की मदद करेगा। –

2

यह LINQ या HQL साथ तुच्छ है, लेकिन मानदंड और QueryOver (यदि आप एक एसक्यूएल प्रक्षेपण का उपयोग करना)

कि के लिए अनुकूलित नहीं कर रहे हैं:

यह है कि मैं अब तक है कोड है

:

select sum(ColorPages) * sum(TotalPages) 
from ConnectorLogEntry 
group by DepartmentName 

LINQ कठिन या तो नहीं है: HQL एसक्यूएल के रूप में लगभग एक ही है

+0

मेरे प्रश्न में यह प्रश्न केवल छोटा हिस्सा है। मेरी वास्तविक क्वेरी यहां और अधिक कठिन है, इसलिए मैंने यहां लिखा है, और मुझे यह सब कुछ पहले से ही QueryOver के साथ मिला है, सभी को hql या linq में ले जाना कठिन और समस्याग्रस्त होगा। –

+0

बहुत बुरा। तब एक एसक्यूएल प्रक्षेपण का प्रयोग करें। अच्छी किस्मत इसे बनाए रखने। –

+0

"मानदंड और क्वेरीओवर" के लिए इसका अनुकूलन क्यों नहीं है? क्या आप एक कस्टम प्रोजेक्शन लिखने के साथ किसी भी मुद्दे की भविष्यवाणी करते हैं जो मेरे लिए इसे संभालेगा? – csano

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