2012-03-19 15 views
5

मैं इस एसक्यूएल कोडनिबर्ननेट के साथ एक सशर्त योग कैसे करें?

SELECT 
ID 
SUM(CASE WHEN myProperty = 2 THEN 1 ELSE 0 END) as nbRowWithValueOf2, 
SUM(CASE WHEN myProperty = 3 THEN 1 ELSE 0 END) as nbRowWithValueOf3 
FROM Foo 
GROUP BY ID 
NHibernate के साथ

के बराबर करने के लिए कोशिश कर रहा हूँ।

अब तक मैं

queryable = queryable 
    .Select(
     Projections.Group<Foo>(c => c.ID), 
     Projections.Sum<Foo>(c => c.myProperty == MyEnum.Two ? 1 : 0) 
     Projections.Sum<Foo>(c => c.myProperty == MyEnum.Three ? 1 : 0) 
) 

की कोशिश की लेकिन यह मुझे निम्न त्रुटि देता है:

Could not determine member from IIF((Convert(c.myProperty) = 2), 1, 0)

आप किसी भी विचार है?

संपादित करें 1: मैं परिणाम 2 प्रश्नों के साथ प्राप्त कर सकता हूं लेकिन मैं इसे केवल 1 क्वेरी में करना चाहता हूं।

संपादित करें 2: मैं यहां क्वेरीओवर का उपयोग कर रहा हूं।

+0

ऐसा लगता है कि आप शायद COUNT' का उपयोग करना चाहिए '' SUM' के बजाय लग रहा है । – yoozer8

+0

गणना शर्तों को स्वीकार नहीं करती है, मैं इसे यहां कैसे उपयोग कर सकता हूं? दो प्रश्न? –

+0

यदि यह क्वेरी स्वीकार नहीं करता है, तो आप केवल उन लोगों को चुनने के लिए 'WHERE' का उपयोग कर सकते हैं जिन्हें आप गिनना चाहते हैं, और फिर' COUNT' का उपयोग करें। – yoozer8

उत्तर

14

मुझे लगता है कि यह (QueryOver सिंटेक्स) काम करना चाहिए:

queryover = queryover 
    .Select(
     Projections.Group<Foo>(c => c.ID), 
     Projections.Sum(
      Projections.Conditional(
       Restrictions.Where<Foo>(f => f.myProperty == MyEnum.Two), 
       Projections.Constant(1), 
       Projections.Constant(0))), 
     Projections.Sum(
      Projections.Conditional(
       Restrictions.Where<Foo>(f => f.myProperty == MyEnum.Three), 
       Projections.Constant(1), 
       Projections.Constant(0)))); 

कौन सा आप निम्नलिखित एसक्यूएल देना चाहिए:

SELECT this_.ID as y0_, 
     sum((case 
       when this_.myProperty = 2 /* @p0 */ then 1 /* @p1 */ 
       else 0 /* @p2 */ 
      end))    as y1_, 
     sum((case 
       when this_.myProperty = 3 /* @p3 */ then 1 /* @p4 */ 
       else 0 /* @p5 */ 
      end))    as y2_ 
FROM [Foo] this_ 
GROUP BY this_.ID 
+0

क्या आप जानते हैं कि यह कैसा दिखता है अगर मैं इसके बजाय क्वेरीओवर का उपयोग करता हूं? –

+0

@AlexeyZimarev: उपरोक्त कोड * है * QueryOver ... –

+0

मेरा मतलब है अनुमानों के बजाय SelectGroup का उपयोग करना। समूह, अनुमानों के बजाय SelectSum.Sum और इसी तरह, इसलिए इनलाइन वाक्यविन्यास के साथ क्वेरीरीवर –

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