3 votes

c# Lambda Query récupérant une des propriétés étrangement nulle

    [HttpGet]
    public ActionResult SecondMission(string Id)
    {
        CATSDDEntities db = new CATSDDEntities();
        db.Configuration.ProxyCreationEnabled = false;
        var setAlet= db.Setalets.Where(x => x.Aletler.Barkod == Id && x.Bolum == 1).Include(x => x.Aletler.AletAD).Include(x => x.Setler).FirstOrDefault();
        if (setAlet == null)
        {
            return Json("Error, Alet Not Found!", JsonRequestBehavior.AllowGet);
        }
        else
        {
            setAlet.Bolum = 2;
            db.SaveChanges();
            var MissionTwoSets = db.Setalets.Where(x => x.Bolum == 2 && x.SetId==setAlet.SetId).Include(x => x.Aletler.AletAD).Include(x => x.Setler).GroupBy(x => x.SetId).ToList();
            return PartialView("~/Views/Shared/_SecondMissionSetPartial.cshtml", MissionTwoSets);
        }
    }

J'appelle cette méthode par ajax

Quand j'appelle cette méthode la première fois Aletler propriété de MissionTwoSets mais lorsque j'appelle cette méthode une deuxième fois et que je récupère plusieurs données, l'un des éléments devient nul dans le fichier de données. Aletler ( LOOK ) c'est assez bizarre j'utilise le même code ailleurs avec les mêmes données et cela fonctionne bien

4voto

Ivan Stoev Points 1156

Include sont ignorés (n'ont pas d'effet) dans les fichiers GroupBy Les propriétés de navigation sont donc normalement les suivantes null .

Cependant, ce que vous voyez est le résultat du suivi du contexte. Puisque vous chargez d'abord une seule entité, ses propriétés chargées rapidement ne sont pas null . Ensuite, lorsque vous exécutez le GroupBy dont le résultat inclut l'entité déjà chargée (suivie), alors EF réutilise cette instance et donc les propriétés de navigation seront toujours renseignées. Toutes les autres entités auront null les propriétés de navigation en raison des "inclusions ignorées" susmentionnées.

Depuis le GroupBy une telle requête n'a aucun sens si elle est exécutée côté serveur (elle n'a pas d'équivalent SQL), la solution est d'exécuter la requête GroupBy côté client (en insérant l'élément typique AsEnumerable() avant lui), ce qui permet de maintenir les inclusions en vigueur :

var MissionTwoSets = db.Setalets
    .Where(x => x.Bolum == 2 && x.SetId==setAlet.SetId)
    .Include(x => x.Aletler.AletAD)
    .Include(x => x.Setler)
    .AsEnumerable() // <-- switch to LINQ to Objects
    .GroupBy(x => x.SetId)
    .ToList();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X