-2
votes

Impossible de modifier la valeur dans la recherche d'iNeumable

Comment changer de valeur d'un objet dans foreach à partir de ienumerable .

code: xxx < p> Je crée déjà modèle . Ensuite, je suis en boucle le résultat en utilisant des objets, puis la définir. Mais le retour pour condition ne change toujours pas? Comment définir la condition à l'intérieur de la recherche, puis retournez-le pour résultat


7 commentaires

Comment savez-vous, cela ne change pas?


Vous ne pouvez pas modifier la liste de propriétés à l'intérieur de la boucle de Forache, vous devez le renvoyer à partir de Linq: à partir de x dans db.pjspaSpevaluation Sélectionnez Nouveau modèle {foo = x.foo, bar = x.bar, condition = "Exemple"}; < / code>.


iEnumerable crée une vue. Il semble probable que vous lisiez à partir de la base de données à chaque fois que vous bouclez via la liste dans votre exemple.


Survolez une liste de retour dans la dernière ligne. La condition ne change pas @backs


Google "Exécution différée": Liste est seulement une requête , pas la répondez à cette requête. Utilisation de foreach vous exécutez cette requête. Mais alors vous retournerez list , l'original requête , alors tout le monde itération de cette question à nouveau exécute , créant de nouveau modèle s à nouveau ...


Je ne peux pas faire comme ça parce que j'ai de nombreuses conditions insces pour recruter if (item.foo == 1) {item.condition = a} else si (item.foo == 2) {item.condition = b} ..... et beaucoup à nouveau @Tetsuyayamamoto


Vous avez besoin de matérialiser une requête avant de mettre à jour une propriété: var matérialisiséList = list.tolist (); boucle via Matérialisateurlist et met à jour .


3 Réponses :


1
votes

Ici, vous essayez de créer une liste de Modèle à l'aide de linq , alors vous êtes itération de la même manière pour ajouter une propriété supplémentaire à chaque élément. Alors pourquoi n'ajoutez-vous pas la propriété au moment de la création de la liste pour une boucle supplémentaire? Faites des choses simples en essayez quelque chose comme ceci: xxx

où le getcondition () peut être défini comme suit: xxx < / p>


0 commentaires

6
votes

iEnumerable code> est une requête, pas une collection. Bien qu'il existe une sorte de collection à l'autre extrémité, la requête elle-même n'est pas la collection em>. La nature de la collection que vous ciblez déterminera si vous pouvez ou non modifier le contenu.

La règle générale est que vous ne pouvez pas vous attendre à un ienumerable code> pour renvoyer la même chose Liste des objets deux fois, voire espérez-vous que vous puissiez énumérer à travers elle plus d'une fois - elle est parfaitement valide (si inhabituelle) pour un ienumerable code> pour énumérer une seule fois seulement et refuser d'énumérer une seconde ou une troisième fois. p>

Dans ce cas, ce que vous avez est en fait une requête de base de données de type iquérirable code> qui est lancé vers ienumerable code>. C'est toujours un iquérirable code> ce qui signifie que chaque fois que vous énumérez-vous à travers elle, vous obtiendrez (probablement) la même liste de données mais dans des objets complètement nouveaux. Changer l'un des objets ne changera pas tous les objets pour le même enregistrement de source, ni modifier le contenu de l'enregistrement sous-jacent lui-même. P>

Si vous essayez de modifier les objets retournés sans modifier les enregistrements sous-jacents. (semble être le cas) alors vous devez matérialiser la requête dans une collection en mémoire. Il existe quelques façons de le faire en fonction de ce que vous attendez avec les données retournées. P>

Le plus simple consiste à convertir la requête en une matrice à l'aide du .toparray () Code> Méthode d'extension: p>

public Model[] ListDaftarPjsp()
{
    var query = from x in db.PJSPEvaluation
                select new Model
                {
                    foo = x.Foo,
                    bar = x.Bar               
                };

    var list = query.ToArray();

    foreach (Model item in list) 
    {
        item.condition = "example";
    }

    return list;
}


0 commentaires

0
votes

Il y a déjà pour ce sujet, mais il y a un moyen plus efficace de le faire. Il suffit d'utiliser la liste au lieu de matry [].

  public List<Model> ListDaftarPjsp()
    {
        List<Model> list = from x in db.PJSPEvaluation
                                  select new Model
                                  {
                                      foo = x.Foo,
                                      bar = x.Bar               
                                  };

        foreach (Model item in list) 
        {
            item.condition = "example";
        }
        return list;
    }

    public class Model{
        public string foo{ get; set; }
        public string bar { get; set; }
        public string condition{ get; set; }
    }


0 commentaires