私は次のようなものを動作させようとしています:
_dbmsParentSections = FactoryTools.Factory.PdfSections
.Include(x => x.Children.OrderBy(y => y.Order).ToList())
.Include(x => x.Hint).Include(x => x.Fields)
.Where(x => x.FormId == FormId && x.Parent == null)
.OrderBy(o => o.Order)
.ToList();
例外の原因となる部分は次のとおりです。
.Include(x => x.Children.OrderBy(y => y.Order).ToList())
編集:
さらに観察すると、
_dbmsParentSections.ForEach(x => x.Children = x.Children.OrderBy(y => y.Order).ToList());
(最初のFactory
呼び出しの後、Children.OrderBy
なしで)私のために仕事をしました。
クエリで子コレクションをソートできないようです。クエリの後にソートするか、2番目のクエリで子をロードします。
同様の質問と回答 こちら
拡張メソッドInclude
は、 DbQuery.Include
の単なるラッパーです。内部的には、式をexecute実行せず、parsesのみ、つまり、メンバー式を取得し、文字列としてパスに変換します。パスはDbQuery.Include
の入力として使用されます。
Include
の機能を強化することが以前に要求されました。 Where
句を含めることにより、部分的にロードされたコレクションを許可します。注文は別の変更要求である可能性があります。しかし、ご覧のとおり、Include
の内部動作のため、このような機能強化を実装するには、メカニズム全体を再設計する必要があります。現在の ロードマップ には表示されないため、しばらく時間がかかる場合があります...
ユースケースによっては、個別のクエリを読み込んだり、後で並べ替えたりする必要がない場合があります。
私の場合、ビューでループするときに注文する必要があったので、そこに注文しました
@foreach (var subObject in Object.SubObjects.OrderBy(x=>x.Order))
このコードを使用して、インクルードを選択し、selectと関数を使用してコレクションを順序付けます。最良ではありませんが、サブコレクションが小さい場合は正常に動作します
// GET: api/Tareas
[HttpGet]
public IEnumerable<Tarea> GetTareas()
{
var result = _context.Tareas
.Include(p => p.SubTareas)
.Select(p => SortInclude(p));
return result;
}
private Tarea SortInclude(Tarea p)
{
p.SubTareas = (p.SubTareas as HashSet<SubTarea>)?
.OrderBy(s => s.Position)
.ToHashSet<SubTarea>();
return p;
}
これは決して機能しません。 EF includeは、すべてを理解してSQLに変換することを試みますが、あなたはこれから多くを望みます。ソートおよび.ToList()-ingなしですべてのエンティティをロードし、IEnumerableの拡張メソッドを記述して、順序付けられた結果を取得します。
一般に、インクルードの束を使用している場合、ビューの子プロパティにアクセスする必要があるためです。ビューで子コレクションにアクセスする必要があるときに、子コレクションを注文します。
たとえば、マスター/詳細フォームのいくつかのIncludeステートメントを作成できます。最初のEFクエリでこれを順序付けする意味はありません。代わりに、実際にアクセスしているときに、これらの子レコードをビューレベルで順序付けしないのはなぜですか?
複数の調査質問がある調査があるかもしれません。モデルの子コレクションを部分ビューに渡すときに、部分ビューレベルで特定の順序で質問を表示する場合。
@Html.Partial("_ResponsesPartial",Model.SurveyResponses.OrderBy(x =>
x.QuestionId))