كيفية الاستعلام عن أقدم كائن من DB4O؟
سؤال
لدي كائنات تحتوي على خاصية 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();
ومع ذلك، هناك مجموعة من المزالق:
- لا تستخدم
DateTime
في كائن الخاص بك المستمر. كان لدي مشاكل هائلة معهم. لا أستطيع إعادة إنتاج المشكلة حتى أتمكن من الإبلاغ عنه بعد، لكنني لا أستطيع أن أوصي شخصيا باستخدامها. إستخدمlong
بدلا من ذلك ونسخ القراد من المعنيDateTime
. وبعد قم بتخزين جميع الأوقات في UTC، إلا إذا كنت تشير صراحة إلى التوقيت المحلي، مثل في حالة وجداول الحافلات. - ضع مؤشر في الوقت
- قد تكون عملية النظام بطيئة للغاية بالنسبة لكميات كبيرة من الكائنات بسبب القضية COR-1133. وبعد إذا كان لديك كمية كبيرة من الكائنات وأنت تعرف العصر التقريبي للكائن، فحاول فرض أ
where
تقييد، لأن ذلك سيكون بسرعة. انظر أيضا بلدي blogpost فيما يتعلق بمسألة الأداء هذه، والتي يمكن أن تصبح مزعجة للغاية بالفعل في كائنات ~ 50-100k.
أفضل،
كريس