سؤال

كيف يمكنني كتابة SQL التالية باستخدام CreateCriteria:

SELECT * FROM FooBar fb
WHERE EXISTS (SELECT FooBarId FROM Baz b WHERE b.FooBarId = fb.Id)
هل كانت مفيدة؟

المحلول 3

لقد عملت على كيفية القيام بذلك باستخدام تعبير isnotempty. هنا يستخدم ملحقات nhibernate lambda:

Session.CreateCriteria<FooBar>()
    .Add(SqlExpression.IsNotEmpty<FooBar>(x => x.Bazes))
    .List<FooBar>();

نصائح أخرى

هكذا كيف تقوم بها:

var fooBars = Session.CreateCriteria<FooBar>()
        .Add(Restrictions.IsNotEmpty("Bazs")).List<FooBar>();

... على افتراض أن هناك خاصية جمع (واحد إلى أقصى) "Bazs" في كائن Foobar.

بدلاً من ذلك ، يمكنك استخدام معايير منفصلة مثل ذلك:

DetachedCriteria dCriteria = DetachedCriteria.For<Baz>("baz")
        .SetProjection(Projections.Property("baz.FooBarId"))
        .Add(Restrictions.EqProperty("baz.FooBarId", "fooBar.Id"));

var fooBars = Session.CreateCriteria<FooBar>("fooBar")
        .Add(Subqueries.Exists(dCriteria)).List<FooBar>();

بعد حل مشكلة ذات صلة وتوصلت في النهاية إلى حل اعتقدت أنني سأشارك الإجابة هنا:

على افتراض أنك تريد استعلام الأسئلة الأصلية ، مع شرط إضافي في المساحة الفرعية:

SELECT * FROM FooBar fb
WHERE EXISTS (SELECT FooBarId FROM Baz b WHERE b.FooBarId = fb.Id
              AND Quantity = 5)

على افتراض أن لديك مرجعًا على فئة BAZ إلى الوالد ، يسمى ، على سبيل المثال FoobarRef [في فئة الخريطة بطلاقة ، يمكنك استخدام طريقة المراجع () ، يمكنك إنشاء الاستعلام على النحو التالي:

DetachedCriteria dCriteria = DetachedCriteria.For<Baz>("baz")
        .SetProjection(Projections.Property("baz.FooBarId"))
        .Add(Expression.EqProperty("this.FooBarId", "FooBarRef.Id"))
        .Add(Expression.Eq("baz.Quantity", 5));

var fooBars = Session.CreateCriteria<FooBar>("fooBar")
        .Add(Subqueries.Exists(dCriteria)).List<FooBar>();

أنا لست مقتنعًا بنسبة 100 ٪ بشأن الترميز الصعب للمستعار "هذا" ، وهو الاسم المستعار nhibernate يعين تلقائيًا إلى كيان الجذر (الجدول) في الاستعلام ، ولكنه الطريقة الوحيدة التي وجدتها للإشارة إلى مفتاح جدول استعلام الوالدين من داخل المساحة الفرعية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top