0

モデル バインディングと厳密に型指定された EF5 dbContext クラスを Web フォーム アプリで使用する GridView があります。gridview は SelectMethod プロパティを使用して、EF5 モデルからクラスを返します。

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

私の EF server_table クラスには、user_table という別のテーブルとの関係があります。私のグリッドでは、次のように列の 1 つの 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とanon型の使用に戻り、モデルバインディングが提供する型チェックを失います、ため息)単純な SortExpression プロパティを GridView に追加するか、カスタム ソートを実行する方法を見つけます。

だから私はそのアイデアをハックして、うまくいくかもしれない何かを思いついた. 私がやっていることは、次のようなソートイベントを宣言することです:

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 で、その保存されたソート式に基づいてラムダを構築しようとしています。たとえば、この場合、「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;
}

したがって、基本的に、テーブル プロパティの名前またはその関連テーブルのプロパティ名とのテーブル リレーションシップの名前がある場合、それからラムダを構築するにはどうすればよいでしょうか。したがって、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 に答える