2011-06-15 10 views
5

मैं QueryOver साथ इस तरह के एक प्रश्न लिखने के लिए इतना है कि परिणाम एसक्यूएल निम्न के समान हो जाएगा चाहते हैं:NHibernate QueryOver होने खंड

Select Bar, count(*) from Foo group by Bar having count(*) > 1 

मैं इसे कैसे कर सकता है?

उत्तर

7

मुझे लगता है कि तुम सिर्फ कहाँ विधि

Session.QueryOver<Foo>() 
    .Select(Projections.GroupProperty(Projections.Property<Foo>(foo => foo.Bar)), 
      Projections.Count<Foo>(f => f.Id)) 
    .Where(Restrictions.Gt(Projections.Count<Foo>(f => f.Id), 1)); 
+1

'अनुमान होना चाहिए। समूहप्रोपर्टी (अनुमान। प्रॉपर्टी (foo => foo.Bar)) ' –

+0

@ डेविड, ठीक है आप बदल गए हैं। – Vadim

+0

अगर हम अनुमानों का उपयोग करते हैं तो यहां क्या अंतर है।()? – Ammad

3

का प्रयोग करेंगे वादिम से जवाब सही है, सिर्फ इतना है कि यह एक चुनौती है, तो एक-दूसरे के डेटाबेस के आधार पर "होने" की स्थिति की जांच करने की जरूरत है हो सकता है उल्लेख करना चाहते हैं खेत।

उदाहरण के लिए निम्नलिखित एसक्यूएल:

select Foo.Bar, COUNT(*) from Foo 
group by Foo.Bar 
having Foo.Bar <> COUNT(*) 

अनिवार्य रूप से इस तरह QueryOver के साथ बनाया जाना चाहिए:

Session.QueryOver<Foo>() 
    .Select(Projections.GroupProperty(Projections.Property<Foo>(foo => foo.Bar)), 
      Projections.Count<Foo>(f => f.Id)) 
    .Where(Restrictions.NotEqProperty(Projections.Count<Foo>(f => f.Id), Projections.Property<Foo>(foo => foo.Bar))); 

लेकिन दुर्भाग्य से NHibernate निम्नलिखित अमान्य एसक्यूएल पैदा करता है (का उपयोग कर जहां बजाय होने का) :

select Foo.Bar, COUNT(*) from Foo 
    group by Foo.Bar 
    where Foo.Bar <> COUNT(*) 

इस समस्या मैं निम्नलिखित inheritence बनाने के लिए किया था पर काबू पाने के लिए:

public class NonEqPropertyExpression : EqPropertyExpression 
    { 
     public NonEqPropertyExpression(IProjection lhsProjection, IProjection rhsProjection) 
      : base(lhsProjection, rhsProjection) 
     { 
     } 

     protected override string Op 
     { 
      get { return "<>"; } 
     } 
    } 

और मानक NonEqProperty के बजाय अपने नए वर्ग का उपयोग करें:

Session.QueryOver<Foo>() 
    .Select(Projections.GroupProperty(Projections.Property<Foo>(foo => foo.Bar)), 
      Projections.Count<Foo>(f => f.Id)) 
    .Where(new NonEqPropertyExpression(Projections.Count<Foo>(f => f.Id), Projections.Property<Foo>(foo => foo.Bar))); 

इस मामले में उत्पादित एसक्यूएल सही है।

+0

मेरे पास एक ही समस्या है जो प्रश्न में पोस्ट की गई है। एक और डीबी से नहीं मिल रहा है, लेकिन इसके बजाय कहां दिखाई देने वाले मानदंड। क्या आप कृपया http://stackoverflow.com/questions/29565783/nhibernate-queryover-criteria-appearing-in-where-instead-in-having-clause-err पर एक नज़र डालें – Ammad

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