Сортировка столбца внешнего ключа в представлении списка с привязкой к модели

Я использую 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;

Другие вопросы по тегам