2016-07-14 6 views
0

Ich versuche, eine Anwendung zu schreiben, mit der ich dynamische Abfragen für meine Datenbank generieren kann. Bis jetzt bin ich in der Lage, Abfragen zu generieren/auszuführen und die Daten in eine Tabelle ohne Probleme zu füllen.Wie berechne ich die Gesamtsumme in C# mit einem generischen Typ?

Verwenden Sie nun einige meiner Abfragen SQL-Aggregatfunktionen d.h COUNT(*), SUM(), AVG(), MAX...

Wenn ich Aggregat-Spalten verwenden, muss ich die aggregierte Spalte für die Endsumme summieren können. Da dies eine dynamische Abfrage ist, kann der Datentyp variieren. Es könnte Integer, Double oder Big Integer sein.

Nachdem die Abfrage ausgeführt wurde, bevölkere ich die Daten in eine Wörterbuchliste. Meine Liste definiert ist, wie diese

public List<Dictionary<string, object>> Data { get; set; } 

Um die Daten in HTML-Tabelle ohne Endsumme bevölkern ich meiner Meinung nach die folgenden do

@for (int y = 0; y < Model.Data.Count; y++) 
{ 
    <tr> 
     @foreach (var attribute in Model.Data[y]) 
     { 
      <td>@attribute.Value</td>    
     } 
    </tr> 
} 

Nun muss ich der Lage sein, Endsumme hinzufügen für einige der aggregierten Spalten. Aber das Problem ist, dass ich den Datentyp nicht kenne, da er als String kommt.

Hier ist, was ich

@{ 

    var aggregateColumns = Model.Columns.Where(x => x.AggregateFunction != ReportsEngine.Support.ReportsGenerator.Report.Contracts.SqlAggregateFunctions.None).ToList(); 

    var grandTotals = new Dictionary<string, object>(); 
} 

    @for (int y = 0; y < Model.Data.Count; y++) 
    { 
     <tr> 
      @foreach (var attribute in Model.Data[y]) 
      { 
       <td>@attribute.Value</td> 

       var column = aggregateColumns.Where(x => x.SqlAlias == attribute.Key).FirstOrDefault(); 

       if(column != null) 
       { 
        //At this point we know this is an aggregate column. Sum the data 
        //grandTotals[attribute.Key] += attribute.Value; 
       } 

      } 
     </tr> 
    } 

versucht zu tun Wie man sehen kann ich ein Wörterbuch zu verwenden, versucht jedes Mal zu erhöhen. grandTotals[attribute.Key] += attribute.Value;

Gibt es eine Möglichkeit, die Daten hinzuzufügen, ohne den tatsächlichen Datentyp zu kennen?

Wie kann ich die Spalten in diesem Fall summieren?

Ich muss in der Lage sein, die Datensätze manuell zu summieren, weil ich später basierend auf den Daten Untersummen benötigen muss.

+1

Sah man sich die TryParse Funktionen? – Missy

+1

Missy, ich müsste den Datentyp kennen, um TryParse verwenden zu können – Jaylen

+0

Sie haben Recht - damit liege ich falsch. Ich dachte, es funktioniert mit allen Typen (das wäre ideal), aber es ist nur String. – Missy

Antwort

0

Dies scheint gut zu funktionieren, obwohl ich alle bin nicht mit dem Ansatz komfortabel:

var result = AddTypelessNumbers((int)15 , (decimal)15.12)); 


static dynamic AddTypelessNumbers(dynamic a, dynamic b) 
{ 
    return a + b;  
} 
+0

Dies scheint zu versuchen, eine Dezimalzahl zu addieren und ganzzahlig zu sein. Ich möchte in der Lage sein, jeden Wert hinzuzufügen, ohne den Typ angeben zu müssen, da ich das nicht weiß. – Jaylen

+0

Ja. Das würde ich tun, um es typübergreifend zu testen. –

+0

Obwohl es auch eine Typprüfung geben sollte, sonst würde es auch Zeichenfolgen akzeptieren ... –

Verwandte Themen