web-dev-qa-db-fra.com

Entity Framework La commande comprend

J'essaie d'obtenir quelque chose comme ce qui suit au travail:

_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();

La partie qui provoque l'exception est:

.Include(x => x.Children.OrderBy(y => y.Order).ToList())

MODIFIER:

Après observation,

_dbmsParentSections.ForEach(x => x.Children = x.Children.OrderBy(y => y.Order).ToList());

a fait le travail pour moi (après l'appel initial Factory et sans le Children.OrderBy).

33
Serj Sagan

Il semble que vous ne puissiez pas trier la collection d'enfants dans votre requête . Effectuez un tri après la requête ou chargez les enfants dans une seconde requête.

Question et réponse similaires ici

34
Olav Nybø

La méthode d'extension Include est un simple wrapper autour de DbQuery.Include . En interne, il n’exécute pas exécuter les expressions, mais seulement les analyse, c’est-à-dire qu’il prend leurs expressions membres et les convertit en chemin en tant que chaîne. Le chemin est utilisé comme entrée pour DbQuery.Include.

Il a été demandé auparavant d'améliorer la fonctionnalité de Include, par exemple. pour autoriser les collections partiellement chargées en incluant une clause Where. La commande peut être une autre demande de changement. Mais comme vous le voyez, en raison du fonctionnement interne de Include, tout le mécanisme devra être repensé pour mettre en œuvre de telles améliorations. Je ne le vois pas sur la carte actuelle , cela peut donc prendre un certain temps ...

11
Gert Arnold

Cela ne fonctionnera jamais. EF include consiste à essayer de tout comprendre et de traduire tout en SQL, mais vous voulez en tirer beaucoup. Chargez toutes les entités sans trier ni .ToList (), et écrivez une méthode d'extension pour IEnumerable afin d'obtenir un résultat ordonné.

1
Peter Kiss

Généralement, si vous utilisez un groupe d'inclusions, vous devez accéder à des propriétés enfants dans une vue. Ce que je fais est de commander la collection enfant lorsque je dois y accéder dans une vue.

Par exemple, je pourrais construire des instructions Include pour un formulaire maître/détaillé. Cela n'a aucun sens de commander ceci à la requête EF initiale. Pourquoi ne pas commander ces enregistrements enfants au niveau de la vue alors que vous y accédez?

Je pourrais avoir un sondage avec plusieurs questions de sondage. Si je souhaite présenter les questions dans un ordre particulier, faites-le au niveau de la vue partielle lorsque je passe la collection enfant modèle à la vue partielle.

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

J'utilise ce code pour commander l'inclusion, en utilisant une sélection et une fonction pour commander la collection ..__ n'est pas le meilleur mais fonctionne bien si la sous-collection est petite

   // 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;
    }
0
FRL

Selon le cas d'utilisation, vous n'aurez peut-être pas besoin de charger dans une requête séparée ou de trier après.

Dans mon cas, j’avais besoin de les commander pour une boucle dans la vue, alors j’ai juste commandé

@foreach (var subObject in Object.SubObjects.OrderBy(x=>x.Order))
0
Иво Недев