モデル バインディングと厳密に型指定された 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 を使用できたらいいのにと思います!! ああ!