استعلام nhibernate عبر جداول متعددة
-
01-10-2019 - |
سؤال
أنا أستخدم nhibernate ، وأحاول معرفة كيفية كتابة استعلام ، يبحث في جميع أسماء كياناتاتي ، ويسرد النتائج. كمثال بسيط ، لدي الكائنات التالية ؛
public class Cat {
public string name {get; set;}
}
public class Dog {
public string name {get; set;}
}
public class Owner {
public string firstname {get; set;}
public string lastname {get; set;}
}
eventaully أريد إنشاء استعلام ، على سبيل المثال ، والذي يعيد جميع مالكي الحيوانات الأليفة باسم "Ted" ، أو حيوانات أليفة تحمل اسمًا يحتوي على "TED".
فيما يلي مثال على SQL أريد تنفيذه:
SELECT TOP 10 d.*, c.*, o.* FROM owners AS o
INNER JOIN dogs AS d ON o.id = d.ownerId
INNER JOIN cats AS c ON o.id = c.ownerId
WHERE o.lastname like '%ted%'
OR o.firstname like '%ted%'
OR c.name like '%ted%'
OR d.name like '%ted%'
عندما أفعل ذلك باستخدام معايير مثل هذه:
var criteria = session.CreateCriteria<Owner>()
.Add(
Restrictions.Disjunction()
.Add(Restrictions.Like("FirstName", keyword, MatchMode.Anywhere))
.Add(Restrictions.Like("LastName", keyword, MatchMode.Anywhere))
)
.CreateCriteria("Dog").Add(Restrictions.Like("Name", keyword, MatchMode.Anywhere))
.CreateCriteria("Cat").Add(Restrictions.Like("Name", keyword, MatchMode.Anywhere));
return criteria.List<Owner>();
تم إنشاء الاستعلام التالي:
SELECT TOP 10 d.*, c.*, o.* FROM owners AS o
INNER JOIN dogs AS d ON o.id = d.ownerId
INNER JOIN cats AS c ON o.id = c.ownerId
WHERE o.lastname like '%ted%'
OR o.firstname like '%ted%'
AND d.name like '%ted%'
AND c.name like '%ted%'
كيف يمكنني ضبط استعلامي بحيث يولد.
شكرا لمساعدتك.
المحلول
جرب هذا ، قد يعمل.
var criteria = session.CreateCriteria<Owner>()
.CreateAlias("Dog", "d")
.CreateAlias("Cat", "c")
.Add(
Restrictions.Disjunction()
.Add(Restrictions.Like("FirstName", keyword, MatchMode.Anywhere))
.Add(Restrictions.Like("LastName", keyword, MatchMode.Anywhere))
.Add(Restrictions.Like("c.Name", keyword, MatchMode.Anywhere))
.Add(Restrictions.Like("d.Name", keyword, MatchMode.Anywhere))
);
نصائح أخرى
تحتاج إلى الجمع بين المعيارين باستخدام Expression.or (المعايير 1 ، المعايير 2)
حسنًا ، أعتقد أنه سيبدو هكذا (مستعار قليلاً من رمز BuggyDigger)
var criteria = session.CreateCriteria<Owner>()
.CreateAlias("Dog", "d")
.CreateAlias("Cat", "c")
.Add(Expression.Or(Expression.Like("c.Name", keyword, MatchMode.Anywhere)
, Expression.Like("d.Name", keyword, MatchMode.Anywhere))
);
لكنني لم ألاحظ أنك تريد ذلك أو كل شيء. في هذه الحالة ، إضافة هذه المعايير إلى الانفصال ، كما أظهر عربات التي تجرها الدواب ، ربما يكون الطريق للذهاب.