partial class Automat
{
public string GameName
{
get
{
return Games == null ? "Неизвестная игра" : Games.Title;;
}
}
}
Член ... не содержит поддерживаемого преобразования
Я использую коннект к БД через Linq. Создал два объекта
Automats и games в отношении 1:M которые завязал на БД.
Для получения имени игры я использую custom property
Код:
Далее замапил этот объект на GridView
Когда делаю сортировку GridView по полу GameName у меня вылетает exception
Член "BusinessObjects.Automat.GameName" не содержит поддерживаемого преобразования в SQL.
английский вариант сообщения
the member "BusinessObjects.Automat.GameName" has no supported translation to SQL
Подскажите в чем пожет быть причина
Нужно каким-то образом переопределить стандартрую функцию сортировки и выборки.
Если у GridView-а AllowSorting="True", тогда твой DataSource (ObjectDataSource) - должен тоже поддерживать сортировку и его свойству SortParameterName должно быть присвоено имя параметра в методе выборки через который передается выражение сортировки (sortExpression).
Т.е. если ты хочешь, чтобы в GridView работала сортировка (чтобы было AllowSorting="True") - обеспечь свой DataSource таким методом выборки, который сможет принмать параметр указанный в SortParameterName и будет знать, что с ним делать.
Как я понимаю на форме есть параметр OrderBy и мне надо написать метод выполняющий сортировку.
Цитата:
Как я понимаю на форме есть параметр OrderBy и мне надо написать метод выполняющий сортировку
Неа, сортировку выполняет сам метод выборки, а как сортировать он знает из выражения сортировки, которое ему сформирует GridView по тем полям, которые ему для этого указаны...
-------------------------------------------
Вот, например, GridView в котором используется сортировка,
для примера оставил в нем колонку c названием организации -
она сортируется по полю Name (это поле есть в результате запроса,
вернее сказать это поле - свойство класса мапера соответствующего).
Код:
<!-- мой GridView -->
<!-- в качестве DataSource-а - ObjectDataSource -->
<asp:GridView ID="gvClientsOrganizations" runat="server" AllowPaging="True"
AllowSorting="True"
AutoGenerateColumns="False"
DataSourceID="odsClientsOrganizations" CssClass="common_list"
onselectedindexchanged="gvClientsOrganizations_SelectedIndexChanged">
<Columns>
<asp:TemplateField HeaderText="Название организации" SortExpression="Name">
<ItemTemplate>
<!-- много чего попало... -->
</ItemTemplate>
</asp:TemplateField>
<!-- всякие другие колонки... -->
...
...
</Columns>
</asp:GridView>
<!-- в качестве DataSource-а - ObjectDataSource -->
<asp:GridView ID="gvClientsOrganizations" runat="server" AllowPaging="True"
AllowSorting="True"
AutoGenerateColumns="False"
DataSourceID="odsClientsOrganizations" CssClass="common_list"
onselectedindexchanged="gvClientsOrganizations_SelectedIndexChanged">
<Columns>
<asp:TemplateField HeaderText="Название организации" SortExpression="Name">
<ItemTemplate>
<!-- много чего попало... -->
</ItemTemplate>
</asp:TemplateField>
<!-- всякие другие колонки... -->
...
...
</Columns>
</asp:GridView>
Смотрим дальше... Уэтого грида источник данных odsClientsOrganizations - это
ObjectDataSource, он выглядит так:
Код:
<asp:ObjectDataSource ID="odsClientsOrganizations" runat="server" OldValuesParameterFormatString="original_{0}"
onObjectCreating="odsClientsOrganizations_ObjectCreating" SelectMethod="GetClientsOrganizations"
UpdateMethod="Update" TypeName="SmallBusinessOnline.Business.ClientOrganization"
EnablePaging="True" MaximumRowsParameterName="endRowIndex" SelectCountMethod="GetCountClientsOrganizations"
SortParameterName="sortExpression"></asp:ObjectDataSource>
onObjectCreating="odsClientsOrganizations_ObjectCreating" SelectMethod="GetClientsOrganizations"
UpdateMethod="Update" TypeName="SmallBusinessOnline.Business.ClientOrganization"
EnablePaging="True" MaximumRowsParameterName="endRowIndex" SelectCountMethod="GetCountClientsOrganizations"
SortParameterName="sortExpression"></asp:ObjectDataSource>
Т.е. в источнике данных выборкой занимается метод GetClientsOrganizations -
это метод бизнесс класса SmallBusinessOnline.Business.ClientOrganization.
смотрим на этот метод:
Код:
/// <summary>
/// Получение списка организаций-клиентов
/// </summary>
/// <param name="startRowIndex">индекс первой записи</param>
/// <param name="endRowIndex">индекс последней запси</param>
/// <param name="sortExpression">выражение сортировки</param>
/// <returns>список организаций</returns>
[System.ComponentModel.DataObjectMethodAttribute(
System.ComponentModel.DataObjectMethodType.Select, true)]
public ClientOrganizationCollection GetClientsOrganizations(string sortExpression, int endRowIndex, int startRowIndex)
{
return RezultTranslator(ClientsOrganizationsDataAccess.GetClientsOrganizations(startRowIndex, endRowIndex, sortExpression));
}
/// Получение списка организаций-клиентов
/// </summary>
/// <param name="startRowIndex">индекс первой записи</param>
/// <param name="endRowIndex">индекс последней запси</param>
/// <param name="sortExpression">выражение сортировки</param>
/// <returns>список организаций</returns>
[System.ComponentModel.DataObjectMethodAttribute(
System.ComponentModel.DataObjectMethodType.Select, true)]
public ClientOrganizationCollection GetClientsOrganizations(string sortExpression, int endRowIndex, int startRowIndex)
{
return RezultTranslator(ClientsOrganizationsDataAccess.GetClientsOrganizations(startRowIndex, endRowIndex, sortExpression));
}
Как видишь у метода выборки есть параметр sortExpressionх -назвать его, можно было как угодно, главное, что источник данных знает что это за параметр, потому что SortParameterName="sortExpression" (см. код ObjectDataSource-а)
само выражение сортировки будет автоматически формироваться гридом при кликах по колонкам и само собой будет передоваться в мето выборки, а вот метод выборки уже знает что с ним делать - он и данные выбирает, он и сортирует их... - т.е. где то
далеко в недрах метода выборки (где-то на уровне DAL) - происходит вызов ХП-шки,
ктороая и выбирает и сортирует и на страницы разбивает и все что угодно делает...
-------------------
У тебя будет несколько иначе, так используется LINQ - у тебя отличаи должны начинаться с иточника данных - у меня как видишь он все получает из
бизнесс объекта, а у тебя от куда?...
Покажи свой код DataSource-а, может станет понятней как тебе помочь...
Спасибо огромное. Скоро проверю. Уверен что все должно быть в порядке. Проверю - отпишусь