Следующий код должен достичь того, что вы пытаетесь сделать. Этот код был протестирован на моем компьютере и, кажется, работает отлично.
<?php $mysqli = new mysqli('localhost', 'root', 'xxxx', 'xxxx');
if ($result = $mysqli->query("SELECT CONCAT(Datum , ' ', Tijd) as Datum, KleurL FROM metingen order by Datum ASC limit 20")) {
$current_row_number = 0;
$output = "[";
while ($row = $result->fetch_object()) {
if ($current_row_number > 0) {
$output = $output . ","; //add comma between each row
}
$output = $output . "[" . $row->KleurL . "," . $row->Datum . "]"; //add each row
$current_row_number++;
}
$output = $output . "]";
echo $output;
$fp = fopen('resultsv2.json', 'w');
fwrite($fp, $output);
fclose($fp);
}
$result->close();
$mysqli->close();
Если вы хотите правильно отформатировать вывод, используйте следующий код:
<?php $mysqli = new mysqli('localhost', 'root', '244466666', 'tkd');
if ($result = $mysqli->query("SELECT CONCAT(Datum , ' ', Tijd) as Datum, KleurL FROM metingen order by Datum ASC limit 20")) {
$current_row_number = 0;
$output = "[";
while ($row = $result->fetch_object()) {
if ($current_row_number > 0) {
$output = $output . ","; //add comma between each row
}
$output = $output . "\n\t" . "[" . "\n\t\t" . $row->KleurL . "," . "\n\t\t" . $row->Datum . "\n\t" . "]"; //add each row
$current_row_number++;
}
$output = $output . "\n]";
// echo $output; //if you want to see the output in the terminal/command prompt
echo "<pre>" . $output . "</pre>"; //if you want to see the output in a browser
$fp = fopen('resultsv2.json', 'w');
fwrite($fp, $output);
fclose($fp);
}
$result->close();
$mysqli->close();
Хорошо, я собираюсь противоречить своему предшествующему оператору. Так как оценка хочет некоторое имя свойства во вложенном управлении, мы должны, вероятно, сформировать те данные.
public class CustomGroup<TKey, TValue>
{
public TKey Key {get;set;}
public IEnumerable<TValue> Values {get;set;}
}
//и используйте его таким образом...
IEnumerable<CustomGroup<Manufacturer, Widget>> result =
GetAllWidgets(widgetTypeId)
.GroupBy(w => w.Manufacturer)
.Select(g => new CustomGroup<Manufacturer, Widget>(){Key = g.Key, Values = g};
///и еще позже...
<asp:ListView ID="ManufacturerListView">
<LayoutTemplate>
<ul>
<asp:Placeholder ID="itemPlaceholder" runat="server" />
</ul>
</LayoutTemplate>
<ItemTemplate>
<li><asp:Label Text='<%# Eval("Key.Name") %>' />
<li>
<asp:ListView ID="WidgetsListView" runat="server" DataSource='<%# Eval("Values") %>'>
<LayoutTemplate>
<ol>
<asp:PlaceHolder runat="server" ID="itemPlaceholder" />
</ol>
</LayoutTemplate>
<ItemTemplate>
<li><asp:Label Text='<%# Eval("Name") %>'></li>
</ItemTemplate>
</asp:ListView>
</li>
</ItemTemplate>
</asp:ListView>
При использовании Linq для группировки, можно получить объект со строгим контролем типов без того формирования:
List<int> myInts = new List<int>() { 1, 2, 3, 4, 5 };
IEnumerable<IGrouping<int, int>> myGroups = myInts.GroupBy(i => i % 2);
foreach (IGrouping<int, int> g in myGroups)
{
Console.WriteLine(g.Key);
foreach (int i in g)
{
Console.WriteLine(" {0}", i);
}
}
Console.ReadLine();
В Вашем случае Вы имели бы:
IEnumerable<IGrouping<Manufacturer, Widget>> result =
GetAllWidgets(widgetTypeId).GroupBy(w => w.Manufacturer);
Это позволит Вам возвратить результат метода.
Я только что потратил на это довольно много времени. В конце концов найдено решение, и оно настолько простое.
var enumerableData = myData.Tables[0].AsEnumerable();
var groupedData = enumerableData.GroupBy(x => x["GroupingColumn"]);
myParentRepeater.DataSource = groupedData;
myParentRepeater.DataBind();
<asp:Repeater ID="myParentRepeater" runat="server">
<ItemTemplate>
<h3><%#Eval("Key") %></h3>
<asp:Repeater ID="myChildRepeater" runat="server" DataSource='<%# Container.DataItem %>'>
<ItemTemplate>
<%#((DataRow)Container.DataItem)["ChildDataColumn1"] %>
<%#((DataRow)Container.DataItem)["ChildDataColumn2"] %>
</ItemTemplate>
<SeparatorTemplate>
<br />
</SeparatorTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
Eval («Key») возвращает сгруппированное значение. При извлечении дочерней информации Container.DataItem имеет тип IGrouping, но вы просто приводите его к правильному типу.
Надеюсь, это поможет кому-то другому.