2016-07-26 33 views
0

我創建了一個簡單的ASP.NET WEB API(MVC 4)。但我不知道如何做大小和分頁。我的查詢下面返回了1000條記錄,加載一次需要時間。RESful ASP.NET WEB API分頁

對於我的控制器,這裏的源代碼:

public GRPORequestData[] getAllGRPO() 
    { 
     List<GRPORequestData> list = new List<GRPORequestData>(); 

     try 
     { 
      string sqlSelect = "SELECT DocEntry, CardCode, Comments, DocDate, DocDueDate FROM OINV WHERE DataSource = 'O' "; 
      APPTech.strCommand = sqlSelect; 
      DataTable dt = new DataTable(); 

      dt = APPTech.Ds.Tables[0]; 

      foreach (DataRow row in dt.Rows) 
      { 
       // Person target = Activator.CreateInstance(); 
       GRPORequestData target = new GRPORequestData(); 
       target.docEntry = row["DocEntry"].ToString(); 
       target.supplier = row["CardCode"].ToString(); 
       target.docdate = row["DocDate"].ToString(); 
       target.duedate = row["DocDueDate"].ToString(); 
       target.remarks = row["Comments"].ToString(); 
       // DataColumnAttribute.Bind(row,target); 

       sqlSelect = "SELECT ItemCode, Quantity, Price, WhsCode, TaxCode FROM INV1 WHERE DocEntry = '" + row["DocEntry"].ToString() + "' "; 
       APPTech.strCommand = sqlSelect; 

       List<RequestDataDetails> requestDetails = new List<RequestDataDetails>(); 

       for (var i = 0; i < APPTech.Ds.Tables[0].Rows.Count; i++) 
       { 
        requestDetails.Add(new RequestDataDetails 
        { 
         itemCode = APPTech.GetDs(0, i).ToString(), 
         quantity = Convert.ToDecimal(APPTech.GetDs(1, i)), 
         price = Convert.ToDecimal(APPTech.GetDs(2, i)), 
         whscode = APPTech.GetDs(3, i).ToString(), 
         taxcode = APPTech.GetDs(4, i).ToString() 
        }); 
       } 
       target.DocumentLines = requestDetails.ToArray(); 

       list.Add(target); 
      } 

      return list.ToArray(); 
     } 
     catch (Exception e) 
     { 
      e.ToString(); 
     } 

     return list.ToArray(); 

    } 

而對於我的模型:

public class GRPORequestData 
{ 
    public string docEntry { get; set; } 

    public string supplier { get; set; } 

    public string docdate { get; set; } 

    public string duedate { get; set; } 

    public string remarks { get; set; } 

    //[DataMember] 
    //public int rowcount { get; set; } 

    public RequestDataDetails[] DocumentLines; 
} 

public class RequestDataDetails 
{ 
    public string itemCode { get; set; } 

    public decimal quantity { get; set; } 

    public decimal price { get; set; } 

    public string whscode { get; set; } 

    public string taxcode { get; set; } 
} 
+0

執行'JOIN'並且只使用一個select語句而不是每行返回額外的n個查詢會不會更容易? – Marco

+0

所以你的問題是如何做你的aspx頁面上的大小和分頁? – Neil

+0

什麼是'APPTech'? – Marco

回答

0

你需要指定多少條記錄每頁和哪個網頁上你是被顯示。

然後,你需要改變你的方法的簽名:

public GRPORequestData[] getAllGRPO(int pageSize, int pageNr) { ... } 

,因爲你需要建造了這座到你的SELECT語句中的最後一步,只得到這些值,這適合您的頁碼。

如果每頁有10條記錄,並且位於第5頁,則表示您將不得不跳過記錄1-40和顯示41-50。

WITH RowNumberResults AS 
(
    //Assuming DocEntry is your primary key/identity column 
    SELECT DocEntry, CardCode, Comments, DocDate, DocDueDate, 
      ROW_NUMBER() OVER (ORDER BY DocEntry) AS rn 
    FROM OINV WHERE  DataSource = 'O' 
) 
SELECT * 
FROM RowNumberResults 
WHERE rn BETWEEN @Skip AND @rest 

現在你需要指定@Skip@Rest爲SqlParameters和增加值 根據我上面的例子,這將是進行跳躍:pageSize * (page -1)和休息:(pageSize * 5) + 1

假設你的對象APPTech是能夠將SqlParameters添加到您的命令中:

APPTech.strCommand.Parameters.Add("@Skip", SqlDbType.Int).Value = pageSize * (page -1); 
APPTech.strCommand.Parameters.Add("@Rest", SqlDbType.Int).Value = (pageSize * 5) + 1;