سؤال

لدي كائنات تحتوي على خاصية DateTime، كيف يمكنني الاستعلام عن أقدم كائن؟

بعد السؤال عن منتدى DB4O، أحصل على الجواب:

إنه سهل للغاية: إنشاء مرتبة SODA-Query and خذ كائن الأول / الأخير من الناتج ObjectSet. وبعد لا تكرر ObjectSet (وبالتالي لن يتم تنشيط الكائنات)، فقط تأخذ الكائن المطلوب مباشرة عبر #ObjectSet.Get(index).

يرجى ملاحظة: يدعم DB4O مجموعة محدودة فقط من فرز الأداء (أبجدي، أرقام، معرفات الكائنات) في تنفيذ الاستعلام، لذلك ربما عليك تخزين DateTime الخاص بك كمللي ثانية لتحقيق أداء جيد.

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

المحلول

بادئ ذي بدء، يحتاج كائنك إلى تتبع الوقت نفسه، لذلك يعتمد ذلك على الاحتياجات الخاصة بك:

class Customer
{
    public DateTime DateSignedUp {get; private set;}
    // ...
}

الآن، يمكنك الاستعلام عن الكائن بأي حال من الأحوال، باستخدام LinQ أو SODA أو استفسارات أصلية، على سبيل المثال

IObjectContainer container = ...;
Customer oldestCustomer = container.Query<Customer>().OrderBy(p => p.DateSignedUp).First();

ومع ذلك، هناك مجموعة من المزالق:

  1. لا تستخدم DateTime في كائن الخاص بك المستمر. كان لدي مشاكل هائلة معهم. لا أستطيع إعادة إنتاج المشكلة حتى أتمكن من الإبلاغ عنه بعد، لكنني لا أستطيع أن أوصي شخصيا باستخدامها. إستخدم long بدلا من ذلك ونسخ القراد من المعني DateTime. وبعد قم بتخزين جميع الأوقات في UTC، إلا إذا كنت تشير صراحة إلى التوقيت المحلي، مثل في حالة وجداول الحافلات.
  2. ضع مؤشر في الوقت
  3. قد تكون عملية النظام بطيئة للغاية بالنسبة لكميات كبيرة من الكائنات بسبب القضية COR-1133. وبعد إذا كان لديك كمية كبيرة من الكائنات وأنت تعرف العصر التقريبي للكائن، فحاول فرض أ where تقييد، لأن ذلك سيكون بسرعة. انظر أيضا بلدي blogpost فيما يتعلق بمسألة الأداء هذه، والتي يمكن أن تصبح مزعجة للغاية بالفعل في كائنات ~ 50-100k.

أفضل،
كريس

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