65

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

_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.

4

8 に答える 8

53

クエリで子コレクションを並べ替えることができないようです。クエリの後で並べ替えるか、2番目のクエリで子をロードします。

ここで同様の質問と回答

于 2013-03-13T06:17:00.683 に答える
28

このドキュメントによると、EF Core 5.0 以降では、含まれるエンティティのプロパティで並べ替えることができます。

 await context.Parents
    .OrderBy(parent => parent.Order)
    .Include(parent => parent.Children.OrderBy(child => child.Order))
    .ToListAsync();

上記の例では、親エンティティを Order で並べ替え、子エンティティを Children エンティティの Order プロパティで並べ替えます。

于 2021-04-07T23:17:16.733 に答える
13

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

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

于 2013-03-13T15:17:20.327 に答える
5

ユースケースによっては、別のクエリにロードしたり、後で並べ替えたりする必要がない場合があります。

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

@foreach (var subObject in Object.SubObjects.OrderBy(x=>x.Order))
于 2019-01-24T13:39:58.703 に答える
1

これは決してうまくいきません。EF includeは、すべてを理解してSQLに変換しようとしますが、これから多くのことを行いたいと考えています。並べ替えや.ToList()を行わずにすべてのエンティティをロードし、IEnumerableの拡張メソッドを記述して順序付けられた結果を取得します。

于 2013-03-13T06:18:34.620 に答える
1

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

たとえば、マスター/詳細フォーム用にいくつかの Include ステートメントを作成する場合があります。最初の EF クエリでこれを注文しても意味がありません。代わりに、これらの子レコードに実際にアクセスしているときに、これらの子レコードをビュー レベルで並べ替えてみませんか?

複数のアンケート質問を含むアンケートがあるかもしれません。質問を特定の順序で提示したい場合は、モデルの子コレクションを部分ビューに渡すときに、部分ビュー レベルで行います。

@Html.Partial("_ResponsesPartial",Model.SurveyResponses.OrderBy(x => 
x.QuestionId))
于 2018-05-09T21:48:50.470 に答える
-4

は型でサポートされていないため、IQueryable型を に変換しIEnumerableて呼び出すべきではありません。IncludeIncludeIEnumerable

要するに、後に Include を呼び出さないでくださいToList

IQueryable = server side call (SQL)
IEnumerable = client side (loaded in memory)
于 2016-05-10T08:41:14.223 に答える