Сортировка столбца внешнего ключа в представлении списка с привязкой к модели
Я использую Listview для отображения некоторых данных с помощью привязки модели и пытаюсь отсортировать столбец в listview, который относится к столбцу внешнего ключа в источнике данных, а именно к столбцу книги.
Модель данных выглядит следующим образом:
public class Book
{
public Book() {
this.Factions = new HashSet<Faction>();
}
public int Id { get; set; }
[Required]
[MaxLength(50)]
public string Title { get; set; }
public virtual ICollection<Faction> Factions { get; set; }
}
public class Faction
{
public int Id { get; set; }
[Required]
[MaxLength(50)]
public string Name { get; set; }
[MaxLength(10)]
public string Abbreviation { get; set; }
public int? BookId { get; set; }
public virtual Book Book { get; set; }
}
И это HTML-код для отображения заголовков для ListItem
<asp:ListView ID="FactionListView" runat="server"
ItemType="DCW.Models.Faction" DataKeyNames="Id"
SelectMethod="FactionGetData"
<LayoutTemplate>
<table class="table table-hover table-bordered">
<thead>
<tr>
<th>
<asp:LinkButton ID="FactionListViewName" runat="server" CommandName="Sort"
CommandArgument="Name">Name</asp:LinkButton></th>
<th>
<asp:LinkButton ID="FactionListViewAbbreviation" runat="server" CommandName="Sort"
CommandArgument="Abbreviation">Abbreviation</asp:LinkButton></th>
<th>
<asp:LinkButton ID="FactionListViewBook" runat="server" CommandName="Sort"
CommandArgument="Book">Book</asp:LinkButton></th>
</tr>
</thead>
<tbody>
<asp:PlaceHolder ID="itemPlaceholder" runat="server" />
</tbody>
</table>
</LayoutTemplate>
При нажатии на кнопку Book LinkButton я получаю сообщение об ошибке: Sys.WebForms.PageRequestManagerServerErrorException: выражения DbSortClause должны иметь тип, сопоставимый по порядку.
Если я изменяю CommandArgument Linkbutton на Book.Id или it.Book.Title (который я читал на некоторых других постах, может работать), я получаю сообщение об ошибке: Sys.WebForms.PageRequestManagerServerErrorException: Исключение было вызвано целью объекта призывание.
Итак, как мне отсортировать связанный столбец в View List с привязкой к модели?
Благодарю.
1 ответ
Таким образом, кажется, что привязка модели не выполняет сортировку навигационных свойств (внешних ключей) из коробки. Я нашел следующее, что я использовал для решения этой проблемы: ASP.Net 4.5 Связывание модели Сортировка по свойствам навигации
Итак, это:
<asp:LinkButton ID="FactionListViewBook" runat="server" CommandName="Sort"
CommandArgument="Book">Book</asp:LinkButton></th>
стала:
<asp:LinkButton ID="FactionListViewBook" runat="server" CommandName="Sort"
CommandArgument="Book.Title">Book</asp:LinkButton></th>
И мой SelectMethod стал:
public IQueryable<GameFaction> FactionGetData(string sortByExpression)
{
IQueryable<Faction> query = _context.Factions.Include(faction => faction.Book);
sortByExpression = sortByExpression == null ? "Name" : sortByExpression;
if (sortByExpression.EndsWith(" DESC"))
{
query = query.OrderByDescending(sortByExpression.SubString(0, sortByExpression.Length - 5));
}
else
{
query = query.OrderBy(sortByExpression);
}
return query;
}
Обратите внимание, что для этого используется метод расширения, упомянутый в приведенной выше ссылке, которая изначально пришла отсюда: Dynamic LINQ OrderBy в IEnumerable