C# + قلعة ActiveRecord:HasAndBelongsToMany ومجموعات
-
02-07-2019 - |
سؤال
دعونا نقول لدي كثير إلى كثير من العلاقة (باستخدام ActiveRecord السمة HasAndBelongsToMany) بين وظائف فئة (كائن المجال تم تغيير الاسم لحماية الأبرياء) وأردت طريقة مثل
FindAllPostByTags(IList<Tag> tags)أن يعود جميع المشاركات التي تحتوي على كافة (وليس بعض) العلامات في المعلمة.على أية حال أنا يمكن إنجاز هذا إما مع NHibernate تعبيرات أو HQL?لقد بحثت من خلال HQL الوثائق و لم أستطع العثور على أي شيء يناسب احتياجات بلدي.أتمنى أن أنا في عداد المفقودين شيء واضح!
المحلول
يمكن أيضا استخدام IN
بيان
DetachedCriteria query = DetachedCriteria.For<Post>();
query.CreateCriteria("Post").Add(Expression.In("TagName", string.Join(",",tags.ToArray()) );
لم بتجميع أن ذلك يمكن أن تحتوي على أخطاء
نصائح أخرى
لا يوجد نظام في متناول اليد مع القلعة تثبيت الآن لذا لم الاختبار أو ترجمة هذا ، ولكن البرمجية أدناه عن أن تفعل ما تريد.
Junction c = Expression.Conjunction();
foreach(Tag t in tags)
c = c.Add( Expression.Eq("Tag", t);
return sess.CreateCriteria(typeof(Post)).Add(c).List();
أنا فقط كان عندي نفس المشكلة و حاولت قراءة HQL-الوثائق ، ولكن بعض الميزات لا يبدو أن يكون تنفيذها في NHibernate (مع-الكلمات الرئيسية على سبيل المثال)
انتهى بي الأمر مع هذا النوع من الحل:
select p FROM Post p JOIN p.Tags tag1 JOIN p.Tags tag2 WHERE tag1.Id = 1 tag2.Id = 2
معنى حيوي في بناء HQL باستخدام الانضمام لكل الوسم ، ثم جعل الاختيار في جملة WHERE.هذا عملت بالنسبة لي.حاولت أن تفعل الشيء نفسه مع DetachedCriteria لكن واجهت مشكلة عند محاولة الانضمام إلى الجدول عدة مرات.