"ORDER BY sort key(s)类型必须与动态数据进行顺序匹配"

Jul*_*n N 7 c# asp.net sorting entity-framework asp.net-dynamic-data

我正在尝试创建一个动态数据网站,该网站应允许管理员直接编辑数据库中大多数表中的数据.

到目前为止,我有一个EDMX和POCO类,都附加到用于在字段上应用DataAnnotations的接口.
我想为每个表都有一个可编辑的网格,所以我编辑了ListDetails模板并按照这些说明进行操作,这样我就可以在ListView中进行内联编辑.
通过所有这些,我可以显示和编辑数据.有用.

但是当我单击一个ForeignKey列的标题(它是一个LinkButton带有SortCommand和列名为CommandArgument 的标题)时,我总是得到以下异常(但排序适用于"简单"属性):

[EntitySqlException:ORDER BY排序键类型必须是顺序可比的.近成员访问表达式,第6行,第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
Sys tem.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)+974

我正在尝试显示和排序的表示例(我正在显示和编辑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; }
}
Run Code Online (Sandbox Code Playgroud)

它可能不起作用,因为它试图对对象属性进行排序,而不是它正在使用的标签,但我希望动态数据处理它(它使用第一个字符串属性作为显示值,为什么它不能使用它用于排序?此外,我还尝试添加DisplayColumn属性,结果相同).

我尝试处理事件ListView.OnSorting以手动编辑EntityDataSource.OrderBy属性,it.LOV_LOB.libelle手动添加值以进行测试.它没用.我还尝试处理EntityDataSource.OnSelecting以查看EntityDataSource.OrderBy的值是什么(如果我不手动设置它,它总是null在排序工作时总是如此).看起来它在此事件后被忽略或替换.并且Exception没有指定它试图应用的OrderBy,因此我不确定它正在尝试做什么.我试图实施,IComparable但它没有奏效.我重写了ToString()以提供显示值,它也不起作用.

我不在乎.有什么建议吗?

Jul*_*n N 0

我最终做了什么:

由于该Sort命令不起作用,我通过自己指定排序参数使其工作:

  • 在OP中链接的模板中,我将标题中的命令名称更改CommandName = "Sort"为自定义名称CommandName = "CustomSort"
  • 将映射添加到ListViewaspx 页面中:OnItemCommand="ListView1_ItemCommand"
  • 在 CodeBehind 页面中,我处理了自定义命令(我知道,将信息存储在 中Session是一个坏主意。请参阅这个问题):

    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 };
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    GridDataSource是我的EntityDataSource对象。
    SortInfos只是一个具有SortSortDirection属性的 POCO 类

效果很好。