Я пишу приложение в ASP.NET Core со страницами Razor. Я пытаюсь отобразить набор данных в наборе таблиц с одной таблицей на человека (SubmittedBy), а затем данные таблицы, которые были отправлены этим человеком.
Моя страница Razor выглядит примерно так (уменьшено для краткости).
@foreach (var user in Model.TableList)
{
<table class = "table">
<thead>
<tr>
<th>@Html.DisplayNameFor(model => model.LoadTable.SubmittedBy): @Html.DisplayFor(modelItem => user.SubmittedBy)</th>
</tr>
<tr>
<th>@Html.DisplayNameFor(model => model.LoadTable.UID)</th>
...
...
...
</tr>
</thead>
<tbody>
@foreach (var item in Model.DataList)
{
<tr>
<th scope = "row" class = "text-center align-middle">
@Html.DisplayFor(modelItem => item.UID)
</th>
<td class = "text-center align-middle">
@Html.DisplayFor(modelItem => item.Age)
</td>
...
...
...
</tr>
}
</tbody>
</table>
}
Я использую LINQ для создания списков и заполнения таблицы следующим образом:
public IEnumerable<LoadTable> TableList;
public IEnumerable<LoadTable> DataList;
TableList = _context.LoadTable.Where(o => o.Approver == GetADDetails.displayName || o.Approver == GetADDetails.userName).GroupBy(user => user.SubmittedBy).Select(group => group.First()).ToList();
DataList = TableList.Where(p => TableList.Any(p2 => p2.SubmittedBy == p.SubmittedBy)).ToList();
Ищите конечный результат, подобный следующему:
Я не могу правильно отображать данные, и чего-то не хватает. Может кто-то указать мне верное направление?
Спасибо,
Вы неправильно привязываете модель. Вместо того, чтобы создаватьDataList
в коде, просто создайте ее перед внутренним циклом foreach на странице Razor (или отправьте перед ней пустую заливку)
@foreach (var user in Model.TableList)
{
<table class = "table">
<thead>
<tr>
<th>@Html.DisplayNameFor(model => model.LoadTable.SubmittedBy): @Html.DisplayFor(modelItem => user.SubmittedBy)</th>
</tr>
<tr>
<th>@Html.DisplayNameFor(model => model.LoadTable.UID)</th>
...
...
...
</tr>
</thead>
<tbody>
@(var DataList=Model.TableList.Where(p=>p.SubmittedBy==user.SubmittedBy).ToList();)
@foreach (var item in DataList)
{
<tr>
<th scope = "row" class = "text-center align-middle">
@Html.DisplayFor(modelItem => item.UID)
</th>
<td class = "text-center align-middle">
@Html.DisplayFor(modelItem => item.Age)
</td>
...
...
...
</tr>
}
</tbody>
</table>
}
Спасибо @Майк. Я получаю Operator '==' cannot be applied to operands of type 'string' and 'LoadTable'
. А также foreach statement cannot operate on variables of type ?
. Есть идеи? Кроме того, я предполагаю, что таким образом мой второй список становится ненужным?
Спасибо, похоже, все в порядке, только отображается только 1 строка данных на человека. Я смотрю на это сейчас, но если у вас есть какие-либо мысли, я был бы признателен.
Это связано с тем, как вы заполнили свой TableList
. Проверь это. Особенно groupby и выберите раздел group.First().
Почти готово. Это дает мне правильные данные, за исключением того, что они зацикливаются слишком много раз. Он зацикливается на количестве совпадений для каждой записи и дает мне таблицу для каждого из них, а не только один раз для каждого пользователя. Спасибо за помощь.
В контексте этого ответа, вы случайно не можете внести свой вклад в мой другой вопрос? stackoverflow.com/questions/56237256/…
Мне кажется, что ваши два запроса можно объединить и немного упростить: просто возьмите эту часть:
_context
.LoadTable
.Where(o => o.Approver == GetADDetails.displayName || o.Approver == GetADDetails.userName)
.GroupBy(user => user.SubmittedBy);
Который вернет коллекцию IGrouping<TKey, TElement>
. Вы можете перебирать коллекцию группировок, где ключом будет пользователь, а значением будет коллекция элементов, связанных с пользователем. Например:
foreach (var userWithItems in Model.TableList)
{
var user = userWithItems.Key;
// TODO: Render the table per user here
foreach (var item in userWithItems)
{
// TODO: Render the items for the user here
}
}
У вас возникает проблема с форматированием таблицы во внешнем интерфейсе или получением данных в задаче с данными.