1

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でこの並べ替え操作を機能させる方法が少しわかりません。誰かが私がここで間違っていることを知っていますか?

前もって感謝します!

4

2 に答える 2

1

私は自分で解決策を見つけました。それはすべて、3 つの文字が欠落しているという問題です。上記のコードでは、これは ...

<asp:LinkButton runat="server" ID="SortButtonName" Text="Name"
                CommandName="Sort" CommandArgument="Address.Name1" />

...間違っているため、次のものに置き換える必要があります。

<asp:LinkButton runat="server" ID="SortButtonName" Text="Name"
                CommandName="Sort" CommandArgument="it.Address.Name1" />

「それ」を使う。フラットフィールドとは対照的に、関連オブジェクトのプロパティが必要なようです。したがって、上記の 2 番目の例では、両方の方法が可能です。

CommandArgument="it.OrderCode" // works
CommandArgument="OrderCode"    // works as well

関連オブジェクトの「オブジェクト ID」(主キー フィールド) についても同様です。

CommandArgument="it.Address.AddressID" // works
CommandArgument="Address.AddressID"    // works as well

ただし、ID ではない関連プロパティについては、次のようになります。

CommandArgument="it.Address.Name1" // works
CommandArgument="Address.Name1"    // does NOT work

私が(偶然にも)この解決策の兆候を見つけることができた唯一の場所は、次のビデオです。

エンティティ データ ソースの使用方法

…特に動画の9:40分あたり。

于 2010-02-22T18:47:04.040 に答える
0

関連付けられたクラスは、CommandArguments または DropDownList の DataTextField 値などで機能しない場合があります。リストとソートにデータ転送オブジェクトを使用できます

public class OrderDTO
{
    public string AddressName1 {get;set;}
}

using (EntitiesContext ctx = new EntitiesContext())
{
    var result = from order in ctx.SOrder
                 let dto = new OrderDTO
                            {
                                  AddressName1 = order.Address.Name1
                                  //bla bla
                            };
                 orderby dto.AddressName1
                 select dto;
}
于 2010-02-20T22:32:25.757 に答える