2

ASP.NET 3.5、LLBLGenPro 3.0、およびDevExpress10.1.7を使用しています。LinqServerModeDataSourceを備えたASPxGridViewがあります。ASPxGridViewの各行は、LLBLGenProのTaskEntityに対応しています。TaskEntityのプロパティの1つは、関連するOrganizationEntitiesのコレクションであるOrganizationCollectionです。私がやりたいのは、OrgListという名前の列をASPxGridViewに追加することです。これにより、関連する組織のリストが名前で表示されます(理想的には-<br>区切りリストであるため、各アイテムは独自の行になりますが、リストは次のようになります。すべて同じセル内にあります。これは、列のEncodeHtmlプロパティが「False」に設定されている場合に機能します。

現在、lsmdsTasks_Selecting()イベントがあります(これは単純化された例です)。

IQueryable<TaskEntity> taskQuery;

taskQuery = TaskQueryStore.GetTasks(...);

var query = from task in taskQuery
            select new 
                   {
                       task.Id,
                       task.TaskName,
                       OrgList = ???
                   }

e.KeyExpression = "Id";
e.QueryableSource = query;

これまで、「???」に対していくつかのことを試しましたが、次の結果が得られました。

まず、私は試しました:

OrgList = task.OrganizationCollection.Aggregate("", (acc, item) => (acc == "" ? "" : acc + "<br>") + item.OrgName)

これにより、次のORMExceptionが発生しました:「'Aggregate'はこのLinqプロバイダーではサポートされていません。サポートされているメソッドを使用してクエリを書き直してみてください。」

次に、私は試しました:

OrgList = String.Join("<br>", task.OrganizationCollection.Select(x => x.OrgName).ToArray())

これにより、次のORMExceptionが発生しました:「'Join'へのメソッド呼び出しには、既知のマップされたデータベース関数または他の既知のハンドラーがありません。」

ある種の効果があったのは次のとおりです。

OrgList = GetOrgList(task.Id)

次に、メソッドを個別に定義しGetOrgList()ます。これにより、タスクIDが取得され、必要な形式でリストが作成され、文字列として返されます。これは実際にはグリッド内のデータを希望どおりに表示しましたが、欠点は、この列で並べ替えようとすると正しく機能せず、オートフィルターを使用してこの列でフィルター処理しようとすると、フィルター処理されるだけであるということです。関係なく、すべてを出します。さらに、必要以上にデータベースに数回アクセスしていると思います。

これをソートとフィルタリングをそのままにして機能させる方法はありますか?または、この列でこれらの機能を無効にする必要がありますか?

4

2 に答える 2

2

カラムにリピーター付きのテンプレートを使用してみてください。データバインディングを使用して、OrgListを列からリピーターに渡すことができます。

このようなもの :

<asp:Repeater runat="server" ID="repeater" Datasource='<%# OrgList %>'>
...
于 2012-11-20T13:27:25.577 に答える
0

最終的に、組織へのprefetchPathを使用してタスクをフェッチし、Linq2Objectsのメモリ内クエリでAggregateを使用して、結果のリストをグリッドのデータソースに渡しました。これでうまくいきました。

于 2012-02-20T15:14:43.153 に答える