2016-03-29 10 views
2

Ich bin mit adrett auf Ergebnis aus gespeicherten Prozedur in Objektliste erhalten gesetzt und senden Sie es an den Client als json:Totalcount für das Paging mit adrett

public IHttpActionResult Test() 
    { 
     List<ProductPreview> gridLines; 
     var cs = ConfigurationManager.ConnectionStrings["eordConnection"].ConnectionString; 
     using (SqlConnection conn = new SqlConnection(cs)) 
     { 
      gridLines = conn.Query<ProductPreview>("dbo.myStoredProcedure", new { userID = 1 }, 
      commandType: CommandType.StoredProcedure).ToList(); 
     } 
     var totalCount = gridLines[0].MaxCount;//I need to know total count 
     .... 
     return Ok(gridLines); 
    } 

Es funktioniert. Die letzte Eigenschaft des Objekts vom Typ ProductPreview ist TotalCount, da die gespeicherte Prozedur die Gesamtzahl als Spalte jeder Zeile zurückgibt. (zweite Option ist, dass gespeicherte Prozedur zwei Re-Cord-Sets zurückgibt, aber ich bin nicht sicher, wie Sie Dapper ändern, um mit zwei Re-Cord-Sets zu arbeiten). Zwei separate Abfragen sind keine Option.

Was wäre der beste Weg, um gridLines json -Objekt zu Client ohne totalCount -Eigenschaft zurückzugeben (da es Overhead ist) und Gesamtanzahl von gespeicherten Prozedur auf eine Variable lesen? Kopieren gridLines Objekt auf ein anderes Objekt ohne totalCount-Eigenschaft wäre auch unnötiger Overhead.

Antwort

2

Sie können dieses Problem anders nähern wollen, da die Anforderung eine Result set und count zu bekommen ist, dann, obwohl QueryMultiple hilft, aber das ist besser genutzt für die multiple result sets, in dieser Fall können Sie nur planen, Dynamic Parameters zu verwenden, die Ihnen helfen können, die OutputParameter, nicht nur die InputParameter, wie Sie standardmäßig mit Anonymous type und bei der Ausführung von conn.Query<ProductPreview> getan haben, die helfen wird, erhalten die Ergebnismenge von Typ IEnumerable<ProductPreview>, kann holen Ausgangsparameterwert um die Anzahl wie unten gezeigt mit Ihrem Code abzurufen:

public IHttpActionResult Test() 
    { 
     List<ProductPreview> gridLines; 
     var cs = ConfigurationManager.ConnectionStrings["eordConnection"].ConnectionString; 
     using (SqlConnection conn = new SqlConnection(cs)) 
     { 
      DynamicParameters dynamicParameters = new DynamicParameters(); 

      dynamicParameters.Add("UserID",1,ParameterDirection.Input); 

      // Fill the Count in this Parameter 
      dynamicParameters.Add("Count",0,ParameterDirection.Output); 

      gridLines = conn.Query<ProductPreview>("dbo.myStoredProcedure", dynamicParameters, 
      commandType: CommandType.StoredProcedure).ToList(); 

      var totalCount = dynamicParameters.Get<int>("Count"); 
     } 

     .... 
     return Ok(gridLines); 
    } 
+2

Vielen Dank. Beide Lösungen funktionieren. Das hört sich passender an. – Simon

2

Dapper können Sie mehrere Ergebnisraster in einer einzigen Abfrage verarbeiten.

Beispiel:

var sql = 
@" 
select * from Customers where CustomerId = @id 
select * from Orders where CustomerId = @id 
select * from Returns where CustomerId = @id"; 

using (var multi = connection.QueryMultiple(sql, new {id=selectedId})) 
{ 
    var customer = multi.Read<Customer>().Single(); 
    var orders = multi.Read<Order>().ToList(); 
    var returns = multi.Read<Return>().ToList(); 
    ... 
}