هل يتم تنفيذ عوامل التصفية لعرض جدول SQL في طريقة عرض في ASP.NET MVC (C#) وLINQ-to-SQL؟

StackOverflow https://stackoverflow.com/questions/491563

سؤال

متابعة من هذا السؤال, ، لقد قمت بتغيير وحدة التحكم الخاصة بي والتوجيه بحيث يتم الآن تعيين قيمة الفرز بواسطة ?sort= ولكنني أريد أيضًا تنفيذ قدرة المستخدمين على تصفية الجدول بناءً على مجموعة مختارة من القيم:

فني :التقنية 1، التقنية 2، التقنية 3، إلخ.فئة :الفئة 1، الفئة 2، الفئة 3، إلخ.أولوية :الأولوية 1، الأولوية 2، الأولوية 3، إلخ.

أنا أستخدم جدولًا واحدًا فقط في الوقت الحالي، لذا فإن أسهل طريقة للحصول على قائمة الفئات المتاحة للتصفية هي تحديد قيم مميزة للفئة من الجدول.يتم إدخالها جميعًا عبر HTML، لذلك يمكنني التحكم في ما يتم إدخاله.لا أريد تقسيمها جميعًا إلى جداول مختلفة حتى الآن، فأنا أحاول أن أفعل كل ما أستطيع باستخدام جدول واحد في الوقت الحالي، ولكن إذا كان هذا هو السيناريو الذي يكسر نموذج الجدول الواحد، فلا بأس، يمكنني ذلك يُعدِّل.

لتوضيح حالة الاستخدام، ربما يكون من الأفضل عرض لقطة شاشة سريعة للعرض المعني:

http://images.robburke.ie/stackoverflow/491563.png
اضغط للعرض بالحجم الكامل.

أريد تنفيذ نظام يمكن من خلاله للمستخدم على سبيل المثال تصفية "الأولوية" لإظهار المشكلات التي كانت الأولوية فيها "استقصائية" فقط.

أنا أبحث عن اقتراحات حول كيفية تنفيذ ذلك على كل من الواجهة الأمامية والخلفية.لقد حاولت العثور على موقع يفعل شيئًا مشابهًا مع جداول البيانات ولكن لا يمكنني التفكير في واحدة من أعلى رأسي على الرغم من أنني متأكد من أن هذه ميزة تم تنفيذها مائة مرة من قبل!

هل يمكن لأي شخص أن يوصي بطريقة جيدة للقيام بذلك؟

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

المحلول

طبقة الخادم

لنبدأ ببعض الكود الزائف.

public ActionResult Open(string sort, string technician, 
    string category, string priority)
{
    // generate query
    // filter stuff
    // order/sort stuff
}

من المهم ترتيب العمليات بشكل صحيح هنا.بعض موفري IQueryable (أنا أنظر إليك، إطار الكيان) سوف يتجاهل الطلب بصمت إذا جاء قبل التصفية.لذا ابدأ بإنشاء استعلام غير مرتب وغير مفلتر، كما هو الحال مع سؤالك الأخير، ثم قم بإلحاق التصفية، وأخيرًا إلحاق الترتيب.

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

الآن، كيف يمكنك تنفيذ التصفية فعليًا؟ما أظهره مارك هو طريقة واحدة.يعمل هذا بشكل جيد حقًا إذا كانت هناك حالات معينة فقط تنوي تصفيتها.من الواضح أنني سأضعها في طريقة مساعدة، وليس في الإجراء نفسه.هناك احتمالات جيدة أنك تحتاج إلى إعادة استخدام هذا المساعد والإجراءات الأخرى.ومع ذلك، إذا كنت تنوي تقديم التصفية على صفوف أكثر مما تهتم بتوضيحه داخل طريقة واحدة، فهناك طريقة أخرى تتمثل في استخدام مكتبة Microsoft Dynamic LINQ، والتي يمكنك الحصول عليها من CodePlex.يتيح لك هذا إنشاء LINQ. حيث يتم استخدام السلاسل بدلاً من تعبيرات lambda.

طبقة المتصفح

الآن بعد أن أصبح تطبيقك قادرًا على التعامل مع هذا الأمر، فأنت بحاجة إلى طريقة لإنشاء رابط يبدو كما يلي:

http://example.com/Issue/Open?sort=ID&priority=Investigative

إذا كانت لديك قائمة بخيارات التصفية، على سبيل المثال، فإن كل عنصر في القائمة سيتوافق مع رابط بمعلمات سلسلة استعلام مختلفة.

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

لذا فإن النهج العام الذي نتبعه عند القيام بذلك هو، لكل عنصر في "قائمة التصفية" (أو أي رابط آخر للمبنى الخاص بك):

  1. قم بإنشاء RouteValueDictionary لمعلمات سلسلة الاستعلام
  2. قم بإضافة كافة معلمات سلسلة الاستعلام التي تم تمريرها إلى العرض الحالي إلى القاموس.
  3. قم بإضافة معلمة سلسلة استعلام إضافية لعنصر القائمة الحالي.
  4. قم بإنشاء رابط URL النهائي باستخدام Html.RouteLink والقاموس الذي أنشأناه.

نصائح أخرى

وأنا لا أفهم تماما حالة الاستخدام - ولكن يمكنك إضافة مرشحات بسهولة عبر IQueryable<T>:

var query = /* your primary query */

if(!string.IsNullOrEmpty(name)) {
    query = query.Where(row => row.Name == name);
}

if(activeOnly) {
    query = query.Where(row => row.IsActive);
}

وغيرها.

ويمكنك أن تفعل أشياء أكثر تطورا من خلال بناء Expression يدويا، ولكن لديها ميزة كونها سهلة التصحيح أعلاه، و(لن المترجم ضمان وجود خاصية IsActive مناسبة، الخ)، فحص مترجم

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