سؤال

هل يعرف أي شخص الطريقة الصحيحة للاستعلام عن تخزين جدول Azure مقابل قيمة فارغة. من ما قرأته ، يكون ذلك ممكنًا (على الرغم من وجود خطأ يمنعه في تخزين التطوير). ومع ذلك ، ما زلت أحصل على الخطأ التالي عندما أفعل ذلك على التخزين السحابي المباشر:

أحد مدخلات الطلب غير صالح.

هذه نسخة مغمورة من استعلام LINQ الذي وضعته معًا.

var query = from fooBar in fooBarSVC.CreateQuery<FooBar>("FooBars")
        where fooBar.PartitionKey == kPartitionID
            && fooBar.Code == kfooBarCode
            && fooBar.Effective_Date <= kFooBarDate.ToUniversalTime()
            && (fooBar.Termination_Date > kFooBarDate.ToUniversalTime() || fooBar.Termination_Date == null)
        select fooBar;

إذا قمت بتشغيل الاستعلام دون التحقق من NULL ، فهو يعمل بشكل جيد. أعلم أن الحل المحتمل هو تشغيل استعلام ثانٍ على المجموعة التي يعيدها هذا الاستعلام. لا مانع من القيام بذلك إذا كنت بحاجة إلى ذلك ، لكنني أرغب في معرفة ما إذا كان بإمكاني الحصول على هذا النهج للعمل أولاً.

أي شخص يرى أي شيء واضح أنا أفعل خطأ؟

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

المحلول

المشكلة هي أنه نظرًا لأن تخزين جدول Azure لا يحتوي على مخطط ، فإن العمود الفارغ غير موجود بالفعل. هذا هو السبب في أن استفسارك غير صالح. لا يوجد شيء مثل عمود فارغ في تخزين الجدول. يمكنك أن تفعل شيئًا مثل تخزين سلسلة فارغة إذا كان عليك حقًا ذلك. حقًا على الرغم من أن المشكلة الأساسية هنا هي أن تخزين جدول Azure لا يتم تصميمه حقًا ليتم الاستعلام عنه من قبل أي أعمدة أخرى غير مفتاح القسم ومفتاح الصف. في كل مرة تقوم فيها بإجراء استعلام على أحد هذه الأعمدة غير القياسية ، تقوم بإجراء فحص الجدول. إذا بدأت في الحصول على الكثير من البيانات ، فستكون لديك معدل مرتفع للغاية من وقت الاستعلام. أود أن أقترح إعداد فهرس يدوي لهذه الأنواع من الاستعلامات. على سبيل المثال ، يمكنك تخزين نفس البيانات في نفس الجدول ولكن مع قيم مختلفة لمفتاح الصف. في النهاية ، إذا كان تطبيقك لا يحصل على استخدام مرتفع مجنون ، فسأستخدم فقط SQL Azure لأنه سيكون أكثر مرونة لأنواع الاستعلامات التي تقوم بها.

استكمال: لدى Azure دليل رائع على تصميم تخزين الجدول الذي أوصي به القراءة. http://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/

نصائح أخرى

لقد واجهت هذه المشكلة ووجدت لعبة نينجا صغيرة لطيفة لاختبار الفارغ. على الرغم من أنني أستخدم واجهة تخزين Azure مباشرةً ، إلا أنني متأكد بنسبة 90 ٪ من أنها ستعمل مع LINQ أيضًا إذا قمت بذلك.

إليك ما فعلته للتحقق مما إذا كان السعر (int32؟) هو NULL:

not (Price lt 0 or Price gt 0)

أظن في حالتك أنه يمكنك فعل الشيء نفسه في LINQ عن طريق الاختبار إذا كان Foobar.Termination_Date أقل أو أكبر من DateTime.UTCNOW على سبيل المثال. شيء من هذا القبيل:

where fooBar.PartitionKey == kPartitionID
  && fooBar.Code == kfooBarCode
  && fooBar.Effective_Date <= kFooBarDate.ToUniversalTime()
  && (fooBar.Termination_Date > kFooBarDate.ToUniversalTime()
  || (not (fooBar.Termination_Date < DateTime.UtcNow 
            or fooBar.Termination_Date > DateTime.UtcNow))
select fooBar;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top