چگونه کاراکترهای خاص را جستجو نماییم!

استفاده از FetchXML راحت‌ترین و سریع‌ترین روش برای انتخاب داده‌ها از جدول‌های مختلف است. برخی مواقع در هنگام کار کردن با این نوع از Queryها ممکن است خطای Invalid XML برای شما پیش آید.

در ادامه مثالی مطرح می‌شود که در آن به دنبال query گرفتن از یک موجودیت به نام پیش بینی هستیم:

string forecastName = “City & Lights (Sample) December 2014″;

string xml = @”<fetch version=’1.0′ output-format=’xml-platform’ mapping=’logical’ encoding=’Windows-1252′

distinct=’false’>” +

          “<entity name=’new_forecast’>” +

          “<attribute name=’new_forecastid’ />” +

          “<attribute name=’new_name’ />” +

          “<order attribute=’new_name’ descending=’false’ />” +

          “<filter type=’and’>” +

         “<condition attribute=’new_name’ operator=’eq’ value='” forecastName + “‘ />” +

        “</filter>” +

        “</entity>” +

        “</fetch>”;

در این مثال خاص نام رکورد کد شده است، ولی در حالت عادی متغیر است. بعد از کمی بررسی به این نتیجه رسیدیم که وجود کاراکتر خاصی مانند & باعث به وجود آمدن مشکل شده است. دلیل مشکل نیز این است که کاراکترهای خاص قبل از استفاده در FetchXML بایستی encode شوند.

با این توصیفات، تلاش کردیم که به کمک اسمبلی System.Web نام رکورد را encode نماییم. در حالت عمومی استفاده از این اسمبلی و متد HttpUtility.HtmlEncode مشکلی را پیش نخواهد آورد. تنها استثنا در این موضوع افزونه‌هایی هستند که به شکل Sandbox ثبت و استفاده شوند. در این حالت اجازه استفاده از این متد را نداریم و با خطای زیر مواجه خواهیم شد:

That assembly does not allow partially trusted callers.

مجدداً برای حل این مشکل دست به گوگل شدیم و استفاده از System.Net را چاره کار یافتیم! Encode نمودن به کمک این Namespace مشکل را به شکل ریشه‌ای حل نمود. Query ما در انتها به شکل زیر طراحی شد:

 

string xml = @”<fetch version=’1.0′ output-format=’xml-platform’ mapping=’logical’ encoding=’Windows-1252′

distinct=’false’>” +

              “<entity name=’new_forecast’>” +

              “<attribute name=’new_forecastid’ />” +

              “<attribute name=’new_name’ />” +

              “<order attribute=’new_name’ descending=’false’ />” +

              “<filter type=’and’>” +

“<condition attribute=’new_name’ operator=’eq’ value='” + WebUtility.HtmlEncode(forecastName) + “‘ />” +

              “</filter>” +

              “</entity>” +

              “</fetch>”;

 

نظرات
  1. ا آزادی 09:56 روز 30 آبان

    این کد که معرفی کردید برای نماها هم کاربرد دارد؟