سؤال

عندي 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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top