Ho una query Linq dinamica, attraverso la quale sto provando ad accedere a dati raggruppati, raggruppati su due colonne e 1 colonna su cui viene utilizzata la funzione di aggregazione.
var gFieldList = new List<string>() { "Supplier", "Country" };
var sFieldList = new List<string>() { "Sales"};
var gField = string.Join(", ", gFieldList.Select(x => "it[\"" + x + "\"] as " + x));
var sField = string.Join(", ", sFieldList.Select(y => "Sum(Convert.ToDouble(it[\""+y+"\"])) as "+y));
var dQueryResult = dataTable
.AsEnumerable()
.AsQueryable()
.GroupBy("new("+gField+")", "it")
.Select("new("+sField+",it.Key as Key, it as Data)");
Per accedere ai dati da dQueryResult, utilizzare il seguente codice.
var groupedData = (from dynamic dat in dQueryResult select dat).ToList();
foreach (var group in groupedData)
{
var key = group.Key;
var sum = group.Sales;
MessageBox.Show("Supplier : " + key.Supplier + "Country : " + key.Country + " SALES : "+Sale.ToString());
}
Il problema è
var gFieldList = new List<string>() { "Supplier", "Country" };
var sFieldList = new List<string>() { "Sales"};
continua a cambiare. Entrambi devono essere dinamici, il che non mi permetterà di accedere ai valori in modo dinamico dal codice sopra menzionato poiché per ora è stato codificato come key.Supplier, key.Country e group.Sales.
Come posso rendere dinamica l'iterazione del risultato della query dinamica?
Ho provato a usare
var groupedData = (from dynamic dat in dQueryResult select dat).ToList();
foreach (var group in groupedData)
{
var key = group.Key;
var sum = group.Sales;
foreach (var v in gFieldList)
{
MessageBox.Show(key.v);
}
}
Ma sta generando un'eccezione affermando che "DynamicClass1" non contiene una definizione per "v"
puoi usare la riflessione in questo modo
foreach (var v in gFieldList)
{
MessageBox.Show(key.GetType().GetProperty(v).GetValue(key,null));
...