2009-06-26 18 views
30

इकाई की रूपरेखा में, संस्थाओं के लिए LINQ का उपयोग कर, डेटाबेस पेजिंग आमतौर पर निम्नलिखित तरीके से किया जाता है:इकाई में पेजिंग फ्रेमवर्क

int totalRecords = EntityContext.Context.UserSet.Count; 
var list  = EntityContext.Context.UserSet 
       .Skip(startingRecordNumber) 
       .Take(pageSize) 
       .ToList(); 

यह दो डेटाबेस कॉल का परिणाम है।

कृपया बताएं, इसे एक डेटाबेस कॉल में कैसे कम करें।

धन्यवाद।

+6

ईएफ में यह त्रुटि में पड़ता है, आपको कॉल करने से पहले ऑर्डरबी को कॉल करना होगा :) अगर आप अपना कोड अपडेट करते हैं तो अच्छा होगा। किसी ने पोस्ट से कोड कॉपी करने में बहुत समय खो दिया होगा। –

+0

चाल यह कैसे करें http://stackoverflow.com/questions/7767409/better-way-to-query-a-page-of-data-and-get-total-count-in-entity-framework -4-1, लेकिन 2 कॉल –

उत्तर

4

हम्म ... पेजिंग का उपयोग करने वाला वास्तविक कॉल दूसरा है - यह एक ही कॉल है।

दूसरा कॉल पंक्तियों की कुल संख्या निर्धारित करना है - यह एक अलग ऑपरेशन है, और मुझे एंटिटी फ्रेमवर्क के साथ एक ही डेटाबेस कॉल में उन दो अलग-अलग संचालनों को गठबंधन करने के तरीके से अवगत नहीं है।

प्रश्न है: क्या आप वास्तव में पंक्तियों की कुल संख्या की आवश्यकता है? किस लिए? क्या यह दूसरी डेटाबेस कॉल के लायक है या नहीं?

आपके पास एक और विकल्प होगा EntityObjectSource (ASP.NET में) का उपयोग करना और फिर इसे बाध्य करना एक ग्रिड व्यू, और ग्रिड व्यू पर AllowPaging और AllowSorting इत्यादि को सक्षम करें, और एएसपी.NET रनटाइम को उचित डेटा पेज को पुनर्प्राप्त करने और इसे प्रदर्शित करने के सभी नट-किरकिरा काम को संभालने दें।

मार्क

+3

के साथ सरल डिज़ाइन होना बेहतर है, आपको कुल रिकॉर्ड की आवश्यकता है ताकि आप जान सकें कि आपके पेजेड इंटरफ़ेस में आपके कितने पेज हैं। मुझे आश्चर्य है कि क्या आप सिर्फ एक सूची कर सकते हैं। गणना या कुछ? – rball

+0

ठीक है, सूची। गणना शायद डेटाबेस से सभी पंक्तियां लाएगी - यह निश्चित रूप से कुछ नहीं है जो आप चाहते हैं। साथ ही, मुझे पूरा यकीन है कि लिंक से इकाइयां आपके एक खाली सेट को आपके पृष्ठ के वास्तविक सेट से परे एक पृष्ठ के लिए पूछेंगी - तो फिर: आपको पंक्तियों की कुल संख्या क्यों चाहिए? वास्तव में? निश्चित रूप से अपने पृष्ठ पर "पृष्ठ 5 में से 17" दिखाना अच्छा लगता है - क्या आप इसके बिना जी सकते हैं? –

+0

उत्तर के लिए धन्यवाद। UI को एक पेजर बार की आवश्यकता है, इसलिए कुल रिकॉर्ड गणना की आवश्यकता है। – dev

7

Esql का उपयोग करना और एक इकाई के लिए एक संग्रहीत प्रक्रिया मानचित्रण समस्या का समाधान कर सकते हैं। एसपी कुल पैरा को आउटपुट पैरामीटर और वर्तमान पृष्ठ के रूप में परिणामसेट के रूप में वापस कर देगा।

CREATE PROCEDURE getPagedList(
@PageNumber int, 
@PageSize int, 
@totalRecordCount int OUTPUT 
AS 

//Return paged records 

कृपया सलाह दें।

धन्यवाद।

+0

+1 अच्छा। इससे आपको 1 डेटाबेस कॉल मिलेगा। आप अभी भी दो प्रश्न निष्पादित करेंगे, लेकिन वे जल्दी और छोटे होंगे। –

33

दो कॉल के साथ क्या गलत है? वे छोटे और त्वरित प्रश्न हैं। डेटाबेस को बहुत से छोटे प्रश्नों का समर्थन करने के लिए डिज़ाइन किया गया है।

पेजिंग के लिए एक प्रश्न करने के लिए एक जटिल समाधान विकसित करना आपको बहुत अधिक भुगतान नहीं दे रहा है।

3
ALTER proc [dbo].[GetNames] 
    @lastRow bigint, 
    @pageSize bigint, 
    @totalRowCount bigint output 
as 
begin 

select @totalRowCount = count(*) from _firstNames, _lastNames 

select 
    FirstName, 
    LastName, 
    RowNumber 
from 
(
    select 
     fn.[FirstName] as FirstName, 
     ln.[Name] as LastName, 
     row_number() over(order by FirstName) as RowNumber 
    from 
     _firstNames fn, _lastNames ln 
) as data 
where 
    RowNumber between (@lastRow + 1) and (@lastRow + @pageSize) 

end 

एक कॉल में इसे पाने के लिए कोई तरीका नहीं है, लेकिन यह काफी तेजी से काम करता है।

+4

यह वास्तव में संभव है। इस उत्तर को कैसे देखें: http://stackoverflow.com/a/7771298/1131804 –

-1

आप एक pagesize = 4

int page =2; 
int pagesize=4; 

var pagedDetails= Categories.Skip(pagesize*(page-1)).Take(pagesize) 
.Join(Categories.Select(item=>new {item.CategoryID,Total = Categories.Count()}),x=>x.CategoryID,y=>y.CategoryID,(x,y)=>new {Category = x,TotalRows=y.Total}); 

आउटपुट श्रेणी और TotalRows के सभी विवरण होगा साथ पेज 2 का विवरण प्राप्त करना चाहते हैं मान लीजिए।

एक डीबी कॉल।

जेनरेट किए गए एसक्यूएल

-- Region Parameters 
DECLARE @p0 Int = 2 
DECLARE @p1 Int = 4 
-- EndRegion 
SELECT [t2].[CategoryID], [t2].[CategoryName], [t2].[Description], [t2].[Picture], [t5].[value] AS [TotalRows] 
FROM (
    SELECT [t1].[CategoryID], [t1].[CategoryName], [t1].[Description], [t1].[Picture], [t1].[ROW_NUMBER] 
    FROM (
     SELECT ROW_NUMBER() OVER (ORDER BY [t0].[CategoryID], [t0].[CategoryName]) AS [ROW_NUMBER], [t0].[CategoryID], [t0].[CategoryName], [t0].[Description], [t0].[Picture] 
     FROM [Categories] AS [t0] 
     ) AS [t1] 
    WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1 
    ) AS [t2] 
INNER JOIN (
    SELECT [t3].[CategoryID], (
     SELECT COUNT(*) 
     FROM [Categories] AS [t4] 
     ) AS [value] 
    FROM [Categories] AS [t3] 
    ) AS [t5] ON [t2].[CategoryID] = [t5].[CategoryID] 
ORDER BY [t2].[ROW_NUMBER] 
+0

गलत। यह हमेशा सभी श्रेणियों की गणना करता है। यहां तक ​​कि यदि मुख्य क्वेरी पर एक जगह लागू होती है। इसके अलावा, यह श्रेणी इकाइयों को वापस नहीं करता है लेकिन एक अनाम प्रकार है, और यह प्रत्येक श्रेणी के लिए बार-बार गिना जाता है। –

+0

आवश्यकता है: 1- पृष्ठ के साथ पृष्ठ का विवरण प्राप्त करें 2- सुनिश्चित करें कि आप एक डीबी कॉल में सभी जानकारी वापस प्राप्त करें। मुझे उम्मीद है कि आप समझेंगे कि आप क्या बात कर रहे हैं ... क्या आपने ऊपर की आवश्यकताओं को देखा? क्या आपने मेरे द्वारा प्रदान किए गए समाधान की कोशिश की है या आप देखकर अपने विचार साझा कर रहे हैं? यदि आप कोशिश करते हैं, तो यह एक डीबी कॉल होगा ... कृपया कोशिश करें और फिर टिप्पणी करें। पाठ्यक्रम की श्रेणी इकाई में कुल गिनती संपत्ति नहीं है लेकिन हम अभी भी इसे उसी कॉल में वापस चाहते हैं ... रिटर्न प्रकार कंक्रीट गुणों के साथ एक अज्ञात वर्ग है श्रेणी और कुल पंक्तियां। – Satchi

+0

एक * छोटा * प्रश्न। क्या होगा यदि वे 'श्रेणियां चाहते हैं। जहां (सी => c.Name.Contains ("ए")) '? –

0

यह प्रश्नों DBManager के लिए बहुत छोटे हैं और मैं नहीं समझ सकता क्यों आप ऐसा करना चाहते हैं, वैसे भी के लिए यह एक डेटाबेस कॉल उपयोग यह करने के लिए कम हो:

var list  = EntityContext.Context.UserSet 
       .Skip(startingRecordNumber) 
       .Take(pageSize) 
       .ToList(); 
int totalRecords = list.Count; 
संबंधित मुद्दे