1

親と有効なcolumnNameが与えられた場合、動的な列名で並べ替えられた、関連するすべての子を検索します。これが私のコードがどのように見えるかを私が思った方法です:

Parent.                                             // EntityObject
Children.                                           // EntityCollection
Where(c => c.Gender == 'm').                        // IEnumerable
OrderBy(columnName, ListSortDirection.Ascending).   // -- not available --
Skip(pages * pageSize).Take(pageSize);

IEnumerable.OrderBy(string columnName)は存在しません。「動的列名による並べ替え」を実行するために周りを見回して、この見栄えの良いソリューションから始めました。実行時の並べ替え用の式ツリーを作成するにはどうすればよいですか。、ただし、これはIQueryableで動作します

もしそうなら、とにかく私のポケットベルのパフォーマンスを分類して低下させるために、それがネットワークを介してレコードをもたらすだろうと私は思います。だから私は再注文しました:

Repository.                                         // Repository
Children.                                           // ObjectSet
Where(c => c.Parent == Parent && c.Gender == 'm').  // ObjectQuery, runtime error
OrderBy(columnName, ListSortDirection.Ascending).   // IOrderedQueryable
Skip(pages * pageSize).Take(pageSize);

ObjectSetとObjectQueryはOrderBy(string columnName)を実装し、このコードはコンパイルされますが、エラーが発生します。

タイプ'DataModel.Parent'の定数値を作成できません。このコンテキストでは、プリミティブ型('Int32、String、Guid'など)のみがサポートされます。

もちろん、親IDを取得することはできますが、Child.ParentReferenceも非プリミティブ型です。

レコードセット全体をネットワーク経由でロードする方法はいくつか考えられますが、すべてのMSを使用してデータベースに基本的なディレクティブのセットを渡すのはそれほど難しくないので、何かが足りないように感じます。中心的なテクノロジー。

編集:私がhttp://en.wikipedia.org/wiki/Quiverfullであるふりをして、子供にページを付ける必要があります。:) edit2:動的列名を照会する必要があることを明確にしました。

4

3 に答える 3

1
var parents = db.Parents; // Do whatever you need to get your unsorted collection from EF here.

if (sortBy == "Gender")
{
    parents = parents.OrderBy(p => p.Gender);
}
else if (sortBy == "FirstName")
{
    parents = parents.OrderBy(p => p.FirstName);
}

さて、これは明らかに複数の列での並べ替えではなく、1 つの列での並べ替えです。また、ソート方向のロジックをさらに追加することもできます。

編集: PredicateBuilder に関するがらくたを削除しました。この回答を入力し始めたときに間違った方向に進んでいたため、古いものを削除するのを忘れていました。

于 2012-08-09T22:26:56.043 に答える
0

OrderBy を置き換えてみてください

OrderBy("age", ListSortDirection.Ascending).

OrderBy(x => x.Age).

また、

Where(c => c.Parent == Parent && c.Gender = 'm').

読むべき

Where(c => c.Parent == Parent && c.Gender == 'm').
于 2012-08-09T21:58:16.573 に答える
0

そのため、私が抱えていた問題がいくつかありました。両方とも質問のタイトルに記載されています。

実行時に選択された、または動的な列名による並べ替えには、式の作成が必要でした。ここでは @Slace の一般的な拡張メソッドを使用しました。

それには IQueryable が必要でした。誤ってクエリを列挙型に変換するたびに、ページングの前にすべての結果を回線経由で戻していたので、IQueryable はうまくいきました。しかし、既に保持しているエンティティとのリレーションシップを使用して、結果の IQueryable を取得する方法が必要でした。

Entity.Idに参加するだけで機能し、データソースで冗長な結合が発生することはありませんでした。EF に期待したほどオブジェクト指向ではありませんが、それでも十分です。

Repository.                                         // Repository
Children.                                           // ObjectSet
Where(c => c.Parent.Id == Parent.Id).               // ObjectQuery, works fine
OrderBy(columnName, ListSortDirection.Ascending).   // IOrderedQueryable
Skip(pages * pageSize).Take(pageSize);              // Only transfers 1 page
于 2012-08-13T20:46:57.913 に答える