0

我在 webforms 应用程序中有一个使用模型绑定和强类型 EF5 dbContext 类的 GridView。gridview 使用 SelectMethod 属性从我的 EF5 模型返回类:

<asp:GridView ID="Server_grid" runat="server" AllowSorting="True"
    ItemType="server_table" SelectMethod="getServers">

我的 EF server_table 类与另一个名为 user_table 的表有关系。在我的网格中,我从 user_table 中为我的列之一提取相关的用户名属性,如下所示:

<asp:TemplateField HeaderText="User Name">
    <ItemTemplate>
        <%# Item.user_table.username %>
</asp:TemplateField>

我的选择方法看起来像:

public IQueryable<server_table> getServers()
{
    return dataContext.server_table.Include(x => x.user_table);
}

这一切都很好,但我需要对这一列进行排序。所以......我要么需要完全放弃模型绑定(嘘!)并在我的查询中选择匿名类型(换句话说,回到使用 LinqDataSource 和匿名类型并失去模型绑定给我的类型检查,叹息)哪个将允许我在 GridView 上简单地添加一个简单的 SortExpression 属性,或者......找出一些方法来进行自定义排序。

所以我一直在琢磨这个想法,并想出了一些可行的方法。我正在做的是声明这样的排序事件:

protected void serverSort(object sender, GridViewSortEventArgs e)
{
    sortExpression = e.SortExpression; //stash in a global
    e.Cancel = true; //don't actually sort
    Server_grid.DataBind(); //I'll sort there based on the stashed sortExpression
}

然后在我的 SelectMethod 中,我试图基于保存的 sortexpression 构建一个 lambda,例如,在这种情况下,我将“user_table.username”放在我的列 SortExpression 属性中,该属性存储在上面的 sortExpression 中,然后解析它并将其用于以下用途:

public IQueryable<server_table> getServers()
{
    var query = dataContext.server_table.Include(x => x.user_table);
    //how do I use the sortExpression string below to build a lambda?
    query = query.OrderBy(SOMETHING CLEVER HERE);
    return query;
}

所以基本上,如果我有表属性的名称或表关系的名称与该相关表上的属性名称,我该如何构建一个 lambda?因此,如果我的 SortExpression 是 server_table 上的简单属性名称,它将起作用,或者如果它是相关表上的属性名称,我可以将 sortExpression 字符串解析为在该表上具有相关表 + 属性名称。我需要能够解析任意长度的关系,即user_table.other_table.another_table.yadday-yadday.property。必须有一种方法,但我的 LINQ 内部 foo 并不是那么好(对此有什么建议吗?)。

或者是否有更好/更简单的方法可以像这样排序,并继续使用我喜欢的模型绑定?我希望我可以在网格 SortExpression 属性中使用 user_table.username !!啊!

4

1 回答 1

0

您可以按顺序使用属性集合p => p.Attributes["ColumnName"]

public IQueryable<server_table> getServers()
{
    var query = dataContext.server_table.Include(x => x.user_table);
    //how do I use the sortExpression string below to build a lambda?
    query = query.OrderBy(p => p.Attributes[ColumnNameStoredInSortExpressVariable]);
    return query;
}
于 2012-11-18T09:54:51.907 回答