لقد ظهر الترحيل في أمثلة في عدة أقسام سابقة، والآن سنشرحه بالتفصيل.
هناك ثلاث طرق لتحقيق ذلك:
1. طريقة Top(int topCount).
في sqlserver وmsaccess، هو في الواقع أعلى، وفي Oracle، يتم تنفيذه من خلال رونوم.
2. من (int startIndex، int endIndex)
عدد السجلات من شريط startIndex إلى شريط endIndex.
3. الصفحة (حجم الصفحة int، حجم الصفحة int)
حجم الصفحة لكل صفحة، pageIndex
فيما يلي أمثلة على هذه الطرق الثلاثة بدورها.
الطريقة العليا:
DbSession.Default.From<Products>()
.الأعلى(10)
.ToList(); يستعلم هذا الاستعلام عن أول 10 سجلات في جدول المنتجات. بيان SQL الذي تم إنشاؤه هو كما يلي: (كيفية إخراج SQL الذي تم إنشاؤه بواسطة مكون العرض).
النص: اختر أفضل 10 * من [المنتجات]
من الطريقة:
DbSession.Default.From<Products>()
.من (3، 8)
.ToList(); يبحث عن البيانات من العنصر 3 إلى العنصر 8 (بما في ذلك العنصرين 3 و8).
النص: SELECT * FROM ( SELECT TOP 6 * FROM ( SELECT TOP 8 * FROM [Products] ORDER BY [Products].[ProductID] ASC) كترتيب مؤقت حسب [ProductID] DESC) كترتيب مؤقت حسب [ProductID] ASC
طريقة الصفحة:
DbSession.Default.From<Products>()
.الصفحة(10، 2)
.ToList(); الاستعلام عن البيانات الموجودة في الصفحة 2 من 10 عناصر لكل صفحة.
النص: SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20 * FROM [Products] ORDER BY [Products].[ProductID] ASC) كترتيب مؤقت حسب [ProductID] DESC) كترتيب مؤقت حسب [ProductID] ASC
يمكن أن نرى أن عبارات SQL التي تم إنشاؤها بواسطة الطريقة من وطريقة الصفحة لها نفس التنسيق. في الواقع، تستدعي طريقة الصفحة الطريقة من في النهاية.
إذا كانت معلمة startIndex الخاصة بـ from تساوي 1، فسيتم استدعاء الطريقة العليا للاستعلام.
افتراضيًا، لا نقوم بتعيين فرز، وسيقوم المكون تلقائيًا بإضافة فرز. إذا كان هناك مفتاح أساسي، فاختر فرز المفتاح الأساسي، وإلا فاختر عمودًا آخر للفرز.
وبطبيعة الحال، في كثير من الحالات نحتاج إلى تحديد الأعمدة التي سيتم فرزها.
على سبيل المثال:
DbSession.Default.From<Products>()
.الصفحة(10، 2)
.OrderBy(المنتجات._.سعر الوحدة.وصف)
.أين (المنتجات._.معرف الفئة == 2)
.ToList(); شرط الاستعلام هو أن معرف الفئة يساوي 2، ويتم فرزه حسب سعر الوحدة بشكل عكسي، وهناك 10 بيانات في الصفحة 2 لكل صفحة.
SQL الذي تم إنشاؤه هو كما يلي:
النص: اختر * من ( اختر أعلى 2 * من [المنتجات] حيث [المنتجات].[CategoryID] = @bee7551993404c8592f07f9b01710bb5 ORDER BY [Products].[UnitPrice] ASC) AS temp_table ORDER BY [UnitPrice] معلمات DESC: @bee7551993404c 8592f07f9b01710bb5[ Int32 ] = 2 هل عبارة SQL هذه غير متوقعة؟ اتضح أن الصفحة الثانية من الاستعلام التي تستوفي الشروط تحتوي فقط على قطعتين من البيانات، لذا عند الاستعلام، ما عليك سوى استخدام سعر الوحدة بترتيب موجب أعلى 2 ويتم ذلك.
دعونا نزيل الشرط ونلقي نظرة:
DbSession.Default.From<Products>()
.الصفحة(10، 2)
.OrderBy(المنتجات._.سعر الوحدة.وصف)
//.أين(المنتجات._.CategoryID == 2)
.ToList(); SQL الذي تم إنشاؤه هو كما يلي:
النص: SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20 * FROM [المنتجات] ORDER BY [Products].[UnitPrice] DESC) AS tempIntable ORDER BY [UnitPrice] ASC) AS tempOuttable ORDER BY [UnitPrice] DESC هذا هو التنسيق العادي الذي تم إنشاؤه متاح الآن.
يتم إنشاء كافة البرامج النصية SQL المذكورة أعلاه ضمن SQL Server2000.
في الواقع، أثناء عملية الاستعلام، ستقوم المؤسسة أيضًا بالاستعلام تلقائيًا عن عدد السجلات التي تستوفي الشروط () ، لذلك في حالة البيانات الضخمة، لن تكون الكفاءة جيدة جدًا.
إذا كانت قاعدة البيانات التي قمت بإعدادها هي sql server2005، فلن يتم الاستعلام عن العدد، ولكن سيتم الاستعلام عنه مباشرة من خلالrow_number() للحصول على كفاءة أفضل. (يتم تنفيذ أوراكل بواسطة رونوم)
فيما يلي مثال لـ sql server2005:
DbSession.Default.From<Products>()
.الصفحة(10، 2)
.OrderBy(المنتجات._.سعر الوحدة.وصف)
//.أين(المنتجات._.CategoryID == 2)
.ToList(); لا يزال الرمز كما هو في المثال أعلاه، وSQL الذي تم إنشاؤه هو:
النص: SELECT * FROM ( SELECT *,row_number() over( ORDER BY [Products].[UnitPrice] DESC) AS tmp__rowid FROM [Products] ) AS tmp_table WHERE (tmp__rowid بين 11 و 20) لا يزال استدعاء الأسلوب كما هو، لذا، إذا كانت المعلمة startIndex الخاصة بـ from تساوي 1، فسيظل الجزء العلوي مستخدمًا أولاً، ولا يتم استخدامrow_numer().
بالطبع، إذا كنت تعتقد أن الترحيل ليس مثاليًا بدرجة كافية، فيمكنك كتابة SQL أو الإجراءات المخزنة بنفسك.