4

EntityDataSource にバインドされた GridView コントロールを含む ASP.NET ページがあります (以下の簡略化されたコードを参照)。グリッドにはアイテムのリストが表示され、この親Parentの .Count を表示する列が含まれています。Childrenグリッドにカウントを適切に表示させることはできますが、並べ替えを子のカウントに設定できるように asp:TemplateField SortExpression 値に何を使用すればよいかわかりません。

これが私のコードの外観です(わかりやすくするために簡略化しています)...

<asp:EntityDataSource ID="edsParentList" runat="server" 
     ConnectionString="name=FooEntities" 
     DefaultContainerName="FooEntities" 
     EnableFlattening="False" 
     EntitySetName="Parents" 
     EntityTypeFilter="Parent"
     Include="Children"
     OrderBy="it.Name"
     Where="(it.Name LIKE '%' + @ParentNameLike + '%')
     >
     <WhereParameters>
         <asp:Parameter Name="ParentNameLike" Type="String" DefaultValue="_" />
     </WhereParameters>
 </asp:EntityDataSource>
 <asp:GridView ID="grdParents" runat="server" 
     AllowPaging="True" 
     AllowSorting="True" 
     AutoGenerateColumns="False" 
     DataSourceID="edsParentList"
     PageSize="20" 
     onpageindexchanged="grdParents_PageIndexChanged" onsorted="grdParents_Sorted" >
     <Columns>
         <asp:TemplateField HeaderText="Name" SortExpression="Name">
             <ItemTemplate>
                 <a href="Parent.aspx?id=<%# Eval("ParentID") %>"><%# Eval("Name") %></a>
             </ItemTemplate>
         </asp:TemplateField>
         <asp:BoundField DataField="BirthDate" HeaderText="Birth Date" 
              DataFormatString="{0:yyyy-MM-dd HH:mm}"
              SortExpression = "BirthDate" />
         <asp:TemplateField HeaderText="Children" SortExpression="Children.Count">
             <ItemTemplate>
                 <asp:Label ID="lblChildCount" runat="server" 
                  Text='<%# Eval("Children.Count") %>'></asp:Label>
             </ItemTemplate>
         </asp:TemplateField>
     </Columns>
 </asp:GridView>

これにより、グリッドが細かく表示されます。ただし、 Children 列のヘッダーをクリックすると、次のエラーがスローされます。

「Count」は「Transient.collection[FooEntities.Child(Nullable=True,DefaultValue=)]」のメンバーではありません。コレクション要素のプロパティを抽出するには、サブクエリを使用してコレクションを反復処理します。

私の質問は:子オブジェクトのコレクションで構成されるナビゲーション プロパティの .Count() で並べ替えを有効にするにはどうすればよいですか?

これを SortExpression で指定する方法はありますか、それとも分解してすべてのページングとソートを手動で行う必要がありますか? (これは明らかに避けたいと思います!)

4

2 に答える 2

1

あなたの立場では、エンティティ クラスは部分として宣言されているため、Parent エンティティ用の補足的な部分クラス コード ファイルを作成し、ChildCount 読み取り専用プロパティを追加してみます。このプロパティは、Children ナビゲーション プロパティを参照します。それから私はそれを分類します。

ここでは、エンティティの派生プロパティと呼ぶものを EntityDataSource で操作できると想定しています。私はこれをテストしていません。

于 2012-04-30T17:27:59.713 に答える
1

SortExpressionエラーを (より単純な例で) 再現しましたが、子供の数で並べ替えを実行するものを見つけることは不可能だと思います。

2 つの重要な追加情報を見ました。

  • 列ヘッダーをクリックするとスローされる例外は、EntitySqlException
  • 最終的に例外をスローするスタック トレースの最後のメソッドは次のとおりです。EntityDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments)

ExecuteSelectは、データ ストアからデータをロードする実際の作業を実行するために、さまざまな特定のデータ ソース コントロールによってオーバーライドされるabstractメソッドです。対応するビューがスローされた例外DataSourceViewである場合、エンティティ SQLを使用してクエリを構築すると結論付けます。EntityDataSourceEntityDataSourceViewEntitySqlExceptionExecuteSelect

引数には、および でDataSourceSelectArguments定義されたパラメータが含まれています。これは、 で指定した並べ替え式である可能性が非常に高いです。これらは、Entity SQL で最終的なクエリを作成するために使用されます。EntityDateSourceSortExpressionTemplateField

は、Entity SQL ステートメントの句SortExpressionとして渡されるだけだと思います。ORDER BYこれは次のようになります。

ORDER BY Children.Count

しかし、これは無効な Entity SQL です。Countナビゲーション参照にはドット パスを使用できますが、Entity SQL のナビゲーション コレクションの"LINQ に似た" メソッドまたはプロパティ ( など) は使用できません。

有効な Entity SQL を記述して、子の数で並べ替えることができます。この例 (ファイルで "Order By - Related Entities" を検索) によると、正しい Entity SQL ステートメントは次のようになります。

"SELECT VALUE p2.p 
 FROM (SELECT p, ANYELEMENT(SELECT VALUE Count(c.ChildId) FROM p.Children AS c)
                 AS childCount
       FROM Parents AS p)
 AS p2
 ORDER BY p2.childCount"

(これは非常に読みにくいので、コードを意味的に正しくインデントする方法さえ知りません。)

ANYELEMENT(SELECT...この構成は、例外が話している「サブクエリ」であり、子コレクションの要素をカウントするために必要だと思います。

明らかに、 を定義するサブクエリ全体なしでは渡すp2.childCountことができません。SortExpressionp2

SortExpression私の結論:子供たちのために働く希望はありません。

SortExpressionたとえば、ヘッダーでクリックイベントをキャッチし、イベントハンドラーで完全なクエリを手動で作成するなど、を使用しない方法があるかもしれませんが、それが可能かどうか、どのように可能かはわかりません。

の消費者が自分でそれを理解しなければEntityDataSourceならないのはなぜですか? GridViewどこかで文書化されているのを見ましたか: 「データ ソースのタイプEntityDataSourceSortExpressiona の aである場合、a は有効なEntity SQLTemplateFieldであるGridView ORDER BY必要があります。 」 私は知りませんでした。「The SortExpressionis is an expression for sorting.」のようなものです。

残念ながら、 で何が起こるか、正しい構文は何か、どのような式がサポートされているかどうかはどこにも明確に述べられてSortExpressionいないため、この回答は回答というよりは推測です。

于 2012-04-30T20:19:40.130 に答える