nhibernate: Createcriteria و revists جملة
-
20-09-2019 - |
سؤال
كيف يمكنني كتابة 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 يعين تلقائيًا إلى كيان الجذر (الجدول) في الاستعلام ، ولكنه الطريقة الوحيدة التي وجدتها للإشارة إلى مفتاح جدول استعلام الوالدين من داخل المساحة الفرعية.