سؤال

أكتب نفس الاستعلام مع نهجين باستخدام nhibernate:

1- باستخدام HQL مثل أدناه

public long RetrieveHQLCount<T>(string propertyName, object propertyValue)
{
    using (ISession session = m_SessionFactory.OpenSession())
    {
        long r = Convert.ToInt64(session.CreateQuery("select count(o) from " + typeof(T).Name + " as o" + " where o." + propertyName + " like '" + propertyValue + "%'").UniqueResult());
        return r;
    }
}

2- باستخدام ICriteria و SetProjections مثل أدناه

public long RetrieveCount<T>(string propertyName, object propertyValue)
{
    using (ISession session = m_SessionFactory.OpenSession())
    {
        // Create a criteria object with the specified criteria
        ICriteria criteria = session.CreateCriteria(typeof(T));
        criteria.Add(Expression.InsensitiveLike(propertyName, propertyValue))
            .SetProjection(Projections.Count(propertyName));

        long count = Convert.ToInt64(criteria.UniqueResult());

        // Set return value
        return count;
    }
}

الآن سؤالي هو أي واحد لديه أداء أفضل؟ لماذا ا؟

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

المحلول

أعتقد أن أفضل طريقة للحصول على مقياس أفضل منها سيكون كما هو مذكور هنا. اذهب لتنزيل NHPROF وملف تعريفه.

http://nhprof.com/

إذا كنت تريد المزيد من التفاصيل ، خذ SQL التي تم إنشاؤها ثم قم بتشغيلها من خلال SQL Server Profiler للحصول على فكرة أفضل عما تفعله.

ولكن بصراحة ، إذا كان لديك أي كمية من البيانات في قاعدة البيانات الخاصة بك ، فإن استعلام مثل ما يشبه سوف يمنحك نتائج مروعة.

أوصي بشدة بإعداد فهرسة النص الكامل في SQL Server ثم استخدام هذا:

http://nhforge.org/blogs/nhibernate/archive/2009/03/13/registering-freetext-or-contains-function-into-a-nhibernate-dialect.aspx

لتسجيل freetext ويحتوي على وظائف في nhibernate.

مثال رائع آخر للاندماج مع استفسارات icriteria هو هنا:

http://xlib.wordpress.com/2009/12/04/integrating-freetext-search-in-nhibernate-detached-criteria/

بدلاً من ذلك ، يمكنك استخدام Lucene.net للقيام بفهرسة النص الكامل أيضًا.

نصائح أخرى

لا يوجد اختلاف كبير في الأداء الجوهري بين HQL والمعايير. إنها مجرد واجهات برمجة التطبيقات المختلفة للتعبير عن استعلام سيتم ترجمته في النهاية إلى SQL ، هذا كل شيء.

تعتمد المعايير (لا يقصد التورية) اختيار واجهة برمجة تطبيقات واحدة على الآخر على سياق الاستخدام. على سبيل المثال ، في حالتك الخاصة ، سأذهب مع المعايير. إن بناء استعلام من سلسلة متسلسل أمر معرض للخطأ ويجب أن تكون حريصًا جدًا على عدم أن تكون عرضة لهجمات الحقن. على الأقل تعيين propertyValue ليكون IQuery معامل...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top