Я использую динамический LINQ для создания группы и выбора на лету. Мои элементы представляют собой коллекции ключей/значений (словари), поэтому они не содержат свойств (это требование дизайна и не может быть изменено). Мне удалось решить часть groupby в еще один вопрос, но он не работает в методе выбора.
Мой код ниже:
private void GetValuesGroupedBy(List<Dictionary<string, object>> list, List<string> groupbyNames, List<string> summableNames)
{
// build the groupby string
StringBuilder groupBySB = new StringBuilder();
groupBySB.Append("new ( ");
bool useComma = false;
foreach (var name in groupbyNames)
{
if (useComma)
groupBySB.Append(", ");
else
useComma = true;
groupBySB.Append("it[\"");
groupBySB.Append(name);
groupBySB.Append("\"]");
groupBySB.Append(" as ");
groupBySB.Append(name);
}
groupBySB.Append(" )");
// and now the select string
StringBuilder selectSB = new StringBuilder();
selectSB.Append("new ( ");
useComma = false;
foreach (var name in groupbyNames)
{
if (useComma)
selectSB.Append(", ");
else
useComma = true;
selectSB.Append("Key.")
//.Append(name)
//.Append(" as ")
.Append(name);
}
foreach (var name in summableNames)
{
if (useComma)
selectSB.Append(", ");
else
useComma = true;
selectSB.Append("Sum(")
.Append("it[\"")
.Append(name)
.Append("\"]")
.Append(") as ")
.Append(name);
}
selectSB.Append(" )");
var groupby = list.GroupBy(groupBySB.ToString(), "it");
var select = groupby.Select(selectSB.ToString());
}
Ключевая часть строки выбора в порядке, но часть Sum не работает. Предполагая, что ключ, который я хочу, называется значением, я пробовал:
«Сумма (значение)» : ParseException: ожидается выражение
"Sum(\"value\")" : ParseException: ожидается выражение
"Sum(it[\"value\"])" : ParseException : не существует применимого статистического метода "Sum"
«Сумма (это [значение])»: ParseException: в типе «Словарь» не существует свойства или поля «значение».
"Sum([\"value\"])" : ParseException: ожидается выражение
Но все потерпели неудачу. Есть идеи?
Спасибо! Шон