"The ORDER BY sort key(s) type must be order-comparable" 具有动态数据
"The ORDER BY sort key(s) type must be order-comparable" with dynamic data
我正在尝试创建一个动态数据网站,该网站应允许管理员直接编辑数据库中大多数 table 中的数据。
到目前为止,我有一个 EDMX 和 POCO 类,它们都附加到一个用于在字段上应用 DataAnnotations 的接口。
我希望每个 table 都有一个 editable 网格,所以我编辑了 ListDetails 模板并遵循 these instructions,这允许我在 ListView 中进行内联编辑。
通过所有这些,我可以显示和编辑数据。有用。
但是当我点击 ForeignKey 列的 header(它是一个 LinkButton
和 Sort
命令,列名作为 CommandArgument)时,我总是得到以下信息异常(但排序适用于 "simple" 属性):
[EntitySqlException: The ORDER BY sort key(s) type must be
order-comparable. Near member access expression, line 6, column 3.]
Microsoft.AspNet.EntityDataSource.EntityDataSourceView.ExecuteSelect(DataSourceSelectArguments
arguments) +1325
System.Web.UI.DataSourceView.Select(DataSourceSelectArguments
arguments, DataSourceViewSelectCallback callback) +21
System.Web.UI.WebControls.DataBoundControl.PerformSelect() +138
System.Web.UI.WebControls.ListView.PerformSelect() +167
System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +30
System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +105
System.Web.UI.WebControls.BaseDataBoundControl.OnPreRender(EventArgs
e) +22 System.Web.UI.Control.PreRenderRecursiveInternal() +83
System.Web.UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Page.ProcessRequestMain(Boolean
includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
+974
我正在尝试显示和排序的 table 示例(我正在显示和编辑 LINK_ENTITES_MODELISEES,我正在尝试对 LOV_LOB 列进行排序):
[MetadataType(typeof(ILINK_ENTITES_MODELISEES_MetaData))]
public partial class LINK_ENTITES_MODELISEES : ILINK_ENTITES_MODELISEES_MetaData
{
public int id_entite_modelisee { get; set; }
public short id_entite { get; set; }
public short id_lob { get; set; }
public System.DateTime date_val_debut { get; set; }
public System.DateTime date_val_fin { get; set; }
public virtual LOV_ENTITE LOV_ENTITE { get; set; }
public virtual LOV_LOB LOV_LOB { get; set; }
}
public partial interface ILINK_ENTITES_MODELISEES_MetaData
{
[Key]
[Required(ErrorMessage = "id_entite_modelisee is required")]
int id_entite_modelisee { get; set; }
[Required(ErrorMessage = "id_entite is required")]
short id_entite { get; set; }
[Required(ErrorMessage = "id_lob is required")]
short id_lob { get; set; }
[Required(ErrorMessage = "date_val_debut is required")]
[DataType(DataType.Date)]
System.DateTime date_val_debut { get; set; }
[Required(ErrorMessage = "date_val_fin is required")]
[DataType(DataType.Date)]
System.DateTime date_val_fin { get; set; }
[Display(Name = "entite")]
LOV_ENTITE LOV_ENTITE { get; set; }
[Display(Name = "lob")]
LOV_LOB LOV_LOB { get; set; }
}
[MetadataType(typeof(ILOV_LOB_MetaData))]
[DisplayColumn("libelle", "libelle", false)]
public partial class LOV_LOB : ILOV_LOB_MetaData
{
public short id { get; set; }
public string libelle { get; set; }
public System.DateTime date_val_debut { get; set; }
public System.DateTime date_val_fin { get; set; }
}
public partial interface ILOV_LOB_MetaData
{
[Key]
[Required(ErrorMessage = "id is required")]
short id { get; set; }
[Required(ErrorMessage = "libelle is required")]
[StringLength(5)]
string libelle { get; set; }
[Required(ErrorMessage = "date_val_debut is required")]
[DataType(DataType.Date)]
System.DateTime date_val_debut { get; set; }
[Required(ErrorMessage = "date_val_fin is required")]
[DataType(DataType.Date)]
System.DateTime date_val_fin { get; set; }
}
它可能不起作用,因为它试图对 object 属性 而不是它使用的标签进行排序,但我希望动态数据能够处理它(它使用第一个字符串属性作为显示值,为什么不能用它来排序?另外我也试过添加DisplayColumn属性,结果一样)。
我尝试处理事件 ListView.OnSorting
以手动编辑 EntityDataSource.OrderBy 属性,手动添加值 it.LOV_LOB.libelle
,以进行测试。它没有用。
我还尝试处理 EntityDataSource.OnSelecting 以查看 EntityDataSource.OrderBy 的值是多少(如果我不手动设置它,即使排序有效,它也总是 null
)。看起来它在此事件后被忽略或替换。而且 Exception 没有指定它试图应用什么 OrderBy,所以我不确定它试图做什么。
我试图实现 IComparable
但它没有用。
我重写了 ToString() 以提供显示值,它也不起作用。
我没主意了。有什么建议吗?
按 LOV_LOB.id
或其他 LOVE_LOB
属性之一排序。作为一个 LOV_LOB 对象本身不能按常规排序,即按数字或日期时间,或按字母顺序排序,但它的属性是。
我最后做了什么:
由于 Sort
命令不起作用,我通过自己指定排序参数使其起作用:
- 在 OP 中链接的模板中,我将 header
CommandName = "Sort"
中的命令名称更改为自定义命令名称 CommandName = "CustomSort"
- 将映射添加到 aspx 页面中的
ListView
:OnItemCommand="ListView1_ItemCommand"
在 CodeBehind 页面中,我处理了自定义命令(我知道,将信息存储在 Session
中是个坏主意。参见 this question):
protected void ListView1_ItemCommand(object sender, ListViewCommandEventArgs e)
{
if (e.CommandName == "CustomSort")
{
var sortInfos = Session["SortInfos"] as SortInfos;
var sortDirection = SortDirection.Ascending;
if (sortInfos != null && sortInfos.Sort == e.CommandArgument.ToString())
{
sortDirection = sortInfos.SortDirection.HasValue && sortInfos.SortDirection == SortDirection.Ascending ? SortDirection.Descending : SortDirection.Ascending;
}
//Get columns metadata
var data = table.Columns.SingleOrDefault(c => c.Name == e.CommandArgument.ToString());
string filter = null;
if (data is MetaForeignKeyColumn)
filter = String.Format("{0} {1}", data.SortExpression, sortDirection == SortDirection.Ascending ? "asc" : "desc");
else
filter = String.Format("it.{0} {1}", data.SortExpression, sortDirection == SortDirection.Ascending ? "asc" : "desc");
GridDataSource.OrderBy = filter;
GridDataSource.AutoGenerateOrderByClause = false;
Session["SortInfos"] = new SortInfos() { Sort = e.CommandArgument.ToString(), SortDirection = sortDirection };
}
}
GridDataSource
是我的 EntityDataSource
object.
SortInfos
只是一个具有 Sort
和 SortDirection
属性的 POCO class
效果很好。
我正在尝试创建一个动态数据网站,该网站应允许管理员直接编辑数据库中大多数 table 中的数据。
到目前为止,我有一个 EDMX 和 POCO 类,它们都附加到一个用于在字段上应用 DataAnnotations 的接口。
我希望每个 table 都有一个 editable 网格,所以我编辑了 ListDetails 模板并遵循 these instructions,这允许我在 ListView 中进行内联编辑。
通过所有这些,我可以显示和编辑数据。有用。
但是当我点击 ForeignKey 列的 header(它是一个 LinkButton
和 Sort
命令,列名作为 CommandArgument)时,我总是得到以下信息异常(但排序适用于 "simple" 属性):
[EntitySqlException: The ORDER BY sort key(s) type must be order-comparable. Near member access expression, line 6, column 3.]
Microsoft.AspNet.EntityDataSource.EntityDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments) +1325
System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +21
System.Web.UI.WebControls.DataBoundControl.PerformSelect() +138
System.Web.UI.WebControls.ListView.PerformSelect() +167
System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +30
System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +105 System.Web.UI.WebControls.BaseDataBoundControl.OnPreRender(EventArgs e) +22 System.Web.UI.Control.PreRenderRecursiveInternal() +83
System.Web.UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +974
我正在尝试显示和排序的 table 示例(我正在显示和编辑 LINK_ENTITES_MODELISEES,我正在尝试对 LOV_LOB 列进行排序):
[MetadataType(typeof(ILINK_ENTITES_MODELISEES_MetaData))]
public partial class LINK_ENTITES_MODELISEES : ILINK_ENTITES_MODELISEES_MetaData
{
public int id_entite_modelisee { get; set; }
public short id_entite { get; set; }
public short id_lob { get; set; }
public System.DateTime date_val_debut { get; set; }
public System.DateTime date_val_fin { get; set; }
public virtual LOV_ENTITE LOV_ENTITE { get; set; }
public virtual LOV_LOB LOV_LOB { get; set; }
}
public partial interface ILINK_ENTITES_MODELISEES_MetaData
{
[Key]
[Required(ErrorMessage = "id_entite_modelisee is required")]
int id_entite_modelisee { get; set; }
[Required(ErrorMessage = "id_entite is required")]
short id_entite { get; set; }
[Required(ErrorMessage = "id_lob is required")]
short id_lob { get; set; }
[Required(ErrorMessage = "date_val_debut is required")]
[DataType(DataType.Date)]
System.DateTime date_val_debut { get; set; }
[Required(ErrorMessage = "date_val_fin is required")]
[DataType(DataType.Date)]
System.DateTime date_val_fin { get; set; }
[Display(Name = "entite")]
LOV_ENTITE LOV_ENTITE { get; set; }
[Display(Name = "lob")]
LOV_LOB LOV_LOB { get; set; }
}
[MetadataType(typeof(ILOV_LOB_MetaData))]
[DisplayColumn("libelle", "libelle", false)]
public partial class LOV_LOB : ILOV_LOB_MetaData
{
public short id { get; set; }
public string libelle { get; set; }
public System.DateTime date_val_debut { get; set; }
public System.DateTime date_val_fin { get; set; }
}
public partial interface ILOV_LOB_MetaData
{
[Key]
[Required(ErrorMessage = "id is required")]
short id { get; set; }
[Required(ErrorMessage = "libelle is required")]
[StringLength(5)]
string libelle { get; set; }
[Required(ErrorMessage = "date_val_debut is required")]
[DataType(DataType.Date)]
System.DateTime date_val_debut { get; set; }
[Required(ErrorMessage = "date_val_fin is required")]
[DataType(DataType.Date)]
System.DateTime date_val_fin { get; set; }
}
它可能不起作用,因为它试图对 object 属性 而不是它使用的标签进行排序,但我希望动态数据能够处理它(它使用第一个字符串属性作为显示值,为什么不能用它来排序?另外我也试过添加DisplayColumn属性,结果一样)。
我尝试处理事件 ListView.OnSorting
以手动编辑 EntityDataSource.OrderBy 属性,手动添加值 it.LOV_LOB.libelle
,以进行测试。它没有用。
我还尝试处理 EntityDataSource.OnSelecting 以查看 EntityDataSource.OrderBy 的值是多少(如果我不手动设置它,即使排序有效,它也总是 null
)。看起来它在此事件后被忽略或替换。而且 Exception 没有指定它试图应用什么 OrderBy,所以我不确定它试图做什么。
我试图实现 IComparable
但它没有用。
我重写了 ToString() 以提供显示值,它也不起作用。
我没主意了。有什么建议吗?
按 LOV_LOB.id
或其他 LOVE_LOB
属性之一排序。作为一个 LOV_LOB 对象本身不能按常规排序,即按数字或日期时间,或按字母顺序排序,但它的属性是。
我最后做了什么:
由于 Sort
命令不起作用,我通过自己指定排序参数使其起作用:
- 在 OP 中链接的模板中,我将 header
CommandName = "Sort"
中的命令名称更改为自定义命令名称CommandName = "CustomSort"
- 将映射添加到 aspx 页面中的
ListView
:OnItemCommand="ListView1_ItemCommand"
在 CodeBehind 页面中,我处理了自定义命令(我知道,将信息存储在
Session
中是个坏主意。参见 this question):protected void ListView1_ItemCommand(object sender, ListViewCommandEventArgs e) { if (e.CommandName == "CustomSort") { var sortInfos = Session["SortInfos"] as SortInfos; var sortDirection = SortDirection.Ascending; if (sortInfos != null && sortInfos.Sort == e.CommandArgument.ToString()) { sortDirection = sortInfos.SortDirection.HasValue && sortInfos.SortDirection == SortDirection.Ascending ? SortDirection.Descending : SortDirection.Ascending; } //Get columns metadata var data = table.Columns.SingleOrDefault(c => c.Name == e.CommandArgument.ToString()); string filter = null; if (data is MetaForeignKeyColumn) filter = String.Format("{0} {1}", data.SortExpression, sortDirection == SortDirection.Ascending ? "asc" : "desc"); else filter = String.Format("it.{0} {1}", data.SortExpression, sortDirection == SortDirection.Ascending ? "asc" : "desc"); GridDataSource.OrderBy = filter; GridDataSource.AutoGenerateOrderByClause = false; Session["SortInfos"] = new SortInfos() { Sort = e.CommandArgument.ToString(), SortDirection = sortDirection }; } }
GridDataSource
是我的EntityDataSource
object.
SortInfos
只是一个具有Sort
和SortDirection
属性的 POCO class
效果很好。