NHibernate: استعلام حتى على قائمة من القيم باستخدام معايير

StackOverflow https://stackoverflow.com/questions/1047895

  •  20-08-2019
  •  | 
  •  

سؤال

وأنا أحاول لتصفية من قبل قائمة القيم باستخدام API المعايير. وأظن أن هذا غير ممكن، وأنا أسأل فقط هنا للتأكد.

class Entity
{
  int id { get; set; }
  IList<Guid> Guids { get; set; }
}

والتعيين:

<class name="Entity">
  <id ...></id>
  <bag name="Guids" table="Entity_Guids">
    <key column="Entity_FK"/>
    <element column="Guid"/>
  </bag>
</class>

ويفترض لدي قائمة من المعرفات الفريدة العمومية (في الواقع هذه هي فرعي آخر). أريد لتصفية جميع الكيانات حيث ارشد واحد على الأقل في قائمة المعرفات الفريدة العمومية.

وسوف SQL تبدو مثل هذا:

SELECT * 
FROM Entity e 
  inner join Entity_Guids eg 
    on  e.id = eg.Entity_FK
WHERE 
  eg.Guid in (subquery)

ومع API المعايير، يبدو أن هذا مستحيل.

ICriteria query = session
  .CreateCriteria(typeof(Entity), "e")
  .Add(Subqueries.In("e.Guids", subquery))

والرميات استثناء.

هل كانت مفيدة؟

المحلول

وسوف الاستعلام الخاص بك لا يعمل لأن الخاصية e.Guids تمريرها إلى فرعي ليست قيمة واحدة. للقيام بذلك بهذه الطريقة تحاول في الواقع لتنفيذ تقاطع وتحقق من أن هذا التقاطع ليس فارغا، والتي للأسف غير موجود في المعهد المعايير، على الرغم من أنك ربما يمكن القيام بذلك مع ينق.

وربما يمكن أن لا تزال تفعل هذا إذا كانت المعرفات الفريدة العمومية الخاصة بك الكيانات مع الخصائص المناسبة (تحتوي الخاصية القيمة GUID الفعلي) وكانت هناك علاقة ثنائية الاتجاه:

var subquery2 = DetachedCriteria.For<GuidEntity>()
  .Add(Subqueries.In("Value", subquery))
  .SetProjection("Entity_FK");

ICriteria query = session.CreateCriteria(typeof (Entity))
  .Add(Subqueries.In("Id", subquery2));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top