मैं QueryOver साथ इस तरह के एक प्रश्न लिखने के लिए इतना है कि परिणाम एसक्यूएल निम्न के समान हो जाएगा चाहते हैं:NHibernate QueryOver होने खंड
Select Bar, count(*) from Foo group by Bar having count(*) > 1
मैं इसे कैसे कर सकता है?
मैं QueryOver साथ इस तरह के एक प्रश्न लिखने के लिए इतना है कि परिणाम एसक्यूएल निम्न के समान हो जाएगा चाहते हैं:NHibernate QueryOver होने खंड
Select Bar, count(*) from Foo group by Bar having count(*) > 1
मैं इसे कैसे कर सकता है?
मुझे लगता है कि तुम सिर्फ कहाँ विधि
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));
का प्रयोग करेंगे वादिम से जवाब सही है, सिर्फ इतना है कि यह एक चुनौती है, तो एक-दूसरे के डेटाबेस के आधार पर "होने" की स्थिति की जांच करने की जरूरत है हो सकता है उल्लेख करना चाहते हैं खेत।
उदाहरण के लिए निम्नलिखित एसक्यूएल:
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)));
इस मामले में उत्पादित एसक्यूएल सही है।
मेरे पास एक ही समस्या है जो प्रश्न में पोस्ट की गई है। एक और डीबी से नहीं मिल रहा है, लेकिन इसके बजाय कहां दिखाई देने वाले मानदंड। क्या आप कृपया http://stackoverflow.com/questions/29565783/nhibernate-queryover-criteria-appearing-in-where-instead-in-having-clause-err पर एक नज़र डालें – Ammad
'अनुमान होना चाहिए। समूहप्रोपर्टी (अनुमान। प्रॉपर्टी (foo => foo.Bar)) ' –
@ डेविड, ठीक है आप बदल गए हैं। – Vadim
अगर हम अनुमानों का उपयोग करते हैं तो यहां क्या अंतर है।()? – Ammad