Мне нужно получить набор виджетов из слоя доступа к данным, сгруппированных по widget.Manufacturer, для отображения в наборе вложенных списков ASP.NET ListViews.
Проблема в том, что (насколько я могу судить) вложенный подход ListView требует от меня формирования данных перед их использованием, и я не могу найти лучший подход для этого. Лучшее, что я смог придумать, - это поместить запрос LINQ в слой доступа к данным, например:
var result = from widget in GetAllWidgets(int widgetTypeID)
group widget by widget.Manufacturer into groupedWidgets
let widgets = from widgetGroup in groupedWidgets
select widgetGroup
select new { Manufacturer = groupedWidgets.Key, Widgets = widgets };
Конечно, анонимные типы нельзя передавать, так что это не работает. Определение пользовательского класса для включения данных кажется неправильным путем. Есть ли способ, которым я могу выполнить группировку на стороне ASP.NET вещей? Я использую ObjectDataSources для доступа к DAL.
Обновлено : ОК, я больше не создаю анонимный тип, и вместо этого мой DAL передает IEnumerable<IGrouping<Manufacturer, Widget>>
странице ASP.NET, но как я могу использовать это в моих ListViews? Мне нужно сделать следующий HTML (или что-то вроде этого)
<ul>
<li>Foo Corp.
<ol>
<li>Baz</li>
<li>Quux</li>
</ol>
</li>
<li>Bar Corp.
<ol>
<li>Thinger</li>
<li>Whatsit</li>
</ol>
</li>
</ul>
Первоначально у меня был ListView внутри ListView, например, так:
<asp:ListView ID="ManufacturerListView">
<LayoutTemplate>
<ul>
<asp:Placeholder ID="itemPlaceholder" runat="server" />
</ul>
</LayoutTemplate>
<ItemTemplate>
<li><asp:Label Text='<%# Eval("Manufacturer.Name") %>' />
<li>
<asp:ListView ID="WidgetsListView" runat="server" DataSource='<%# Eval("Widgets") %>'>
<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>
Обратите внимание, что свойство DataSource
объекта WidgetsListView само по себе связано с данными. Как я могу продублировать эту функцию без изменения данных?
Это становится немного сложнее, извините, если бы я просто вместо этого задал отдельный вопрос.