ASP.NETページにasp:ListViewコントロールがあります。これは、次のように設定されたEntityDataSourceにバインドされます。
<asp:EntityDataSource ID="EntityDataSourceOrders" runat="server"
ConnectionString="name=EntitiesContext"
DefaultContainerName="EntitiesContext" EntitySetName="SOrder"
Include="Address"
EnableDelete="True" EnableInsert="True"
EnableUpdate="True">
</asp:EntityDataSource>
SQL Serverには、SOrderとAddressの2つのテーブルがあります。SOrderには、アドレステーブルへの外部キーAddressIDがあります(「注文には1つのアドレスがあります」)。アドレスには英数字フィールド「Name1」があります。
ListViewのLayoutTemplateには、リスト内の注文を注文の住所のName1で並べ替えるためのリンクボタンがあります。
<asp:LinkButton runat="server" ID="SortButtonName" Text="Name"
CommandName="Sort" CommandArgument="Address.Name1" />
このボタンをクリックすると、「現在のコンテキストでは「Address.Name1」を解決できませんでした」というEntitySqlExceptionが発生します。
注文テーブルの「フラット」フィールド(たとえば「OrderCode」)で並べ替えると、次のように機能します。
<asp:LinkButton runat="server" ID="SortButtonOrderCode" Text="Order number"
CommandName="Sort" CommandArgument="OrderCode" />
したがって、例外は、別のテーブルの関連フィールドで並べ替えようとした場合にのみ発生します。EntityDataSourceのInclude="Address"プロパティを使用すると、関連するアドレスのフィールドで並べ替えることができるはずですが、そうではないようです。
EntityDataSourceが内部で作成することを期待するクエリをチェックするためにテストハックを行いました。
エンティティへのLinqの場合:
using (EntitiesContext ctx = new EntitiesContext())
{
var result = from order in ctx.SOrder.Include("Address")
orderby order.Address.Name1
select order;
foreach (SOrder x in result)
{
string test=x.Address.Name1;
}
}
またはエンティティSQLの場合:
string queryString = @"SELECT VALUE x FROM SOrder AS x
Order By x.Address.Name1";
using (EntitiesContext ctx = new EntitiesContext())
{
ObjectQuery<SOrder> query =
new ObjectQuery<SOrder>(queryString, ctx).Include("Address");
foreach (SOrder x in query.Execute(MergeOption.AppendOnly))
{
string test=x.Address.Name1;
}
}
両方とも動作します!ソートされた結果が得られます。
ListViewでこの並べ替え操作を機能させる方法が少しわかりません。誰かが私がここで間違っていることを知っていますか?
前もって感謝します!