استعلام ActiveRecord (القلعة، الأداء)
-
06-07-2019 - |
سؤال
عندي 3 جداول:
- القطع:
Name
:اسم الداخلي،Active
:منطقي - اللغات:قائمة اللغات (الإنجليزية، الفرنسية، الألمانية، ....)
- ترجمات الأجزاء:
RealName
ومعرفات الجدولين الآخرين.
أود الحصول على قائمة القطع يقول لي الداخلية name
, active
حالة و كم عدد الترجمات المفقودة (إجمالي الترجمات التي تم إجراؤها)
لقد قمت بإنشاء استعلام SQL هذا الذي يمنحني ما أحتاج إليه (لا أعرف إذا كانت هذه هي الطريقة الأفضل للقيام بذلك أم لا، ولكنها تعمل):
SELECT
parts1.name,
parts1.active,
(
(SELECT count(lang.id)
FROM languages AS lang)
-
(SELECT count(trans.id)
FROM parts AS parts2
INNER JOIN partstranslations as trans
ON parts2.id = trans.partid
WHERE parts2.id = parts1.id)
)
from parts as parts1;
1° سؤال- كيف يمكنني إجراء هذا الاستعلام باستخدام Castle ActiveRecord؟
2° السؤال- كيف هو أداء الاستعلام النهائي (باهظ الثمن)؟
شكرًا
المحلول
لقد تمكنت من إجراء هذا الاستعلام في ActiveRecord باستخدام HqlBasedQuery
, ، لذلك أنشر هنا الإجابة لمساعدة الآخرين في نفس وضعي.
HqlBasedQuery query = new HqlBasedQuery(typeof(Part),
@"
SELECT
par.Id,
par.Name,
par.Active,
(SELECT count(*) - count(trans) FROM Language)
FROM Part par
LEFT JOIN par.PartsTranslations trans
GROUP BY par.Id, par.Name, par.Active, trans.Part
");
query.SetQueryRange(startId, currentPageSize);
var results = from object[] summary in
(ArrayList)ActiveRecordMediator.ExecuteQuery(query)
select new PartProjection
{
Id = (int)summary[0],
Name = (string)summary[1],
Active = (bool)summary[2],
TransMissing = (long)summary[3]
};
لقد قمت أيضًا بإنشاء ترقيم الصفحات في هذا الاستعلام كما أنه يمنحني كتابة قوية PartProjection
أشياء.لا تحتاج هذه الفئة إلى أي معلمة ActiveRecord.
نصائح أخرى
لا يمكنني المساعدة فيما يتعلق بـ ActiveRecord، ولكن يجب أن يكون أداء هذا الاستعلام أفضل من الاستعلام الذي يتضمن استعلامًا فرعيًا مرتبطًا.
SELECT
p.name,
p.active,
(SELECT count(*) FROM languages) - count(pt.divid)
FROM
Parts p
LEFT JOIN PartsTranslations pt ON p.id=pt.divid
GROUP BY p.id, p.name, p.active
أو، إذا كنت تريد استخدام الاستعلام الفرعي المرتبط، فلن تحتاج إلى الاختيار من بينها Parts
فيه مرة أخرى:
SELECT
p.name,
p.active,
(SELECT count(*) FROM Languages) -
(SELECT count(*) FROM PartsTranslations WHERE divid = p.id)
FROM Parts p;