web-dev-qa-db-ja.com

エンティティフレームワークの注文に含まれるもの

私は次のようなものを動作させようとしています:

_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なしで)私のために仕事をしました。

36
Serj Sagan

クエリで子コレクションをソートできないようです。クエリの後にソートするか、2番目のクエリで子をロードします。

同様の質問と回答 こちら

36
Olav Nybø

拡張メソッドIncludeは、 DbQuery.Include の単なるラッパーです。内部的には、式をexecute実行せず、parsesのみ、つまり、メンバー式を取得し、文字列としてパスに変換します。パスはDbQuery.Includeの入力として使用されます。

Includeの機能を強化することが以前に要求されました。 Where句を含めることにより、部分的にロードされたコレクションを許可します。注文は別の変更要求である可能性があります。しかし、ご覧のとおり、Includeの内部動作のため、このような機能強化を実装するには、メカニズム全体を再設計する必要があります。現在の ロードマップ には表示されないため、しばらく時間がかかる場合があります...

12
Gert Arnold

ユースケースによっては、個別のクエリを読み込んだり、後で並べ替えたりする必要がない場合があります。

私の場合、ビューでループするときに注文する必要があったので、そこに注文しました

@foreach (var subObject in Object.SubObjects.OrderBy(x=>x.Order))
2

このコードを使用して、インクルードを選択し、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;
    }
1
FRL

これは決して機能しません。 EF includeは、すべてを理解してSQLに変換することを試みますが、あなたはこれから多くを望みます。ソートおよび.ToList()-ingなしですべてのエンティティをロードし、IEnumerableの拡張メソッドを記述して、順序付けられた結果を取得します。

1
Peter Kiss

一般に、インクルードの束を使用している場合、ビューの子プロパティにアクセスする必要があるためです。ビューで子コレクションにアクセスする必要があるときに、子コレクションを注文します。

たとえば、マスター/詳細フォームのいくつかのIncludeステートメントを作成できます。最初のEFクエリでこれを順序付けする意味はありません。代わりに、実際にアクセスしているときに、これらの子レコードをビューレベルで順序付けしないのはなぜですか?

複数の調査質問がある調査があるかもしれません。モデルの子コレクションを部分ビューに渡すときに、部分ビューレベルで特定の順序で質問を表示する場合。

@Html.Partial("_ResponsesPartial",Model.SurveyResponses.OrderBy(x => 
x.QuestionId))
0
Charles Owen