سؤال

لدي الكود التالي:

public List<anEntity> Get(int page, int pagesize, Func<anEntity, IComparable> orderby)
{            
    using (var ctx = new MyContext())
    {                
        return ctx.anEntity.OrderBy(orderby).Skip(pagesize * page).Take(pagesize).ToList();                    
    }           
}

عندما أتحقق من ملف تعريف قاعدة البيانات الخاص بي (SqlServer 2012) يمكنني رؤية فحص جدول كامل رهيب دون أي عبارة "TOP".

الجزء المثير للاهتمام:

إذا فعلت شيئًا مشابهًا ولكن حددت ترتيبًا ملموسًا حسب:

return ctx.anEntity.OrderBy(x => x.aField).Skip(pagesize * page).Take(pagesize).ToList();

يُظهر الملف الشخصي جملة "TOP" جميلة.

أود تجنب وجود الكثير من الطرق، واحدة لكل إمكانية "الطلب".أي تلميح سيكون موضع تقدير كبير.

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

المحلول

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

تغيير نوع المعلمة إلى Expression<Func<anEntity, T>>, ، أين T هي معلمة عامة جديدة يجب عليك إضافتها إلى ملفك Get الطريقة، وسوف تعمل كما هو متوقع.

وبطبيعة الحال، لن تتمكن من استخدام العرف IComparable, ، ولكن ليس هناك طريقة للتغلب على ذلك:لا يمكن ترجمة التعليمات البرمجية المخصصة إلى SQL.

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