1
votes

Problème lors de l'extraction de la valeur du champ de la liste dans Foreach

Objectif: j'ai une vue d'index qui montre tous les enregistrements ouverts de la table (ICS_Transactions). Actuellement, il affiche TOUS les enregistrements. J'essaie de faire quelque chose de rapide pour filtrer tous les enregistrements qui n'ont PAS de correspondance dans la table secondaire (ICS_Orders). Inutile d'afficher des enregistrements sans commandes associées.

Cela fonctionne presque (je pense). Je crois que mon problème est ce domaine

List<ICS_Transactions> newqList = new List<ICS_Transactions>();
var q = db.ICS_Transactions.Where(s => s.OpenClosed == "Open");
q = q.Where(s => s.TransType == "New Internal Order");

var MyReqs = q.FirstOrDefault().RequsitionNumber;

foreach (ICS_Transactions trans in q)
{
//do whtaever you need to see if this trans should be includxed

var z = db.ICS_Orders.Where(s => s.RequisitionNumber == MyReqs );

if (z == null)
{
// do nothing
          
else 
{ 
newqList.Add(trans); 
}
           
}

return View(newqList);

Le foreach fonctionne, sauf qu'il ne saisit que le numéro de demande du premier enregistrement à chaque fois. Et je comprends pourquoi (FirstorDefault). Mais, je ne sais pas par quoi remplacer cela - pour continuer à faire une boucle à chaque fois. J'ai simplement essayé de supprimer le (.FirstOrDefault ()) mais cette syntaxe n'est pas correcte.

Voici le code complet du contrôleur d'index

var MyReqs = q.FirstOrDefault().RequsitionNumber;


0 commentaires

3 Réponses :


1
votes

Et si vous utilisiez Select ()?

var z = q.Select(p => p.RequisitionNumber);

Vous avez maintenant une collection contenant uniquement le champ RequisitionNumber de chaque objet de votre collection "q".


0 commentaires

1
votes
  1. Remplacez MyReqs par var MyReqs = trans.RequsitionNumber; et déplacez-le dans foreach
  2. Changement:
  3. var newqList = db.ICS_Transactions.Where(s => s.OpenClosed == "Open");
        .Where(s => s.TransType == "New Internal Order")
        .ToList();
    
    var reqsInOrders = db.ICS_Orders
        .Where(s => newqList.Select(n => n.RequisitionNumber).Contains(s.RequisitionNumber))
        .Select(s => s.RequisitionNumber)
        .ToList();
    
    newqList  = newqList
        .Where(t => reqsInOrders.Contains(t.RequisitionNumber))
        .ToList();
    

    to:

    var newqList = db.ICS_Transactions
        .Where(s => s.OpenClosed == "Open");
        .Where(s => s.TransType == "New Internal Order")
        .Where(s => s.ICS_Orders.Any())
        .ToList();
    

    Ou juste si vous avez configuré des relations, vous pouvez essayer de le faire en une seule requête, ressemblant à quelque chose comme ça (pas sûr des relations que vous avez):

    if(z.Any())
    { 
        newqList.Add(trans); 
    }
    

    Ou au moins récupérer tous les RequsitionNumber nécessaires à partir de ICS_Orders dans une requête à la base de données et filtrer la liste:

    if (z == null)
    {
        // do nothing
    }       
    else 
    { 
        newqList.Add(trans); 
    }
    

2 commentaires

Guru Stron - Merci! Merci à tous ceux qui ont répondu. Je crois que tout était super. J'ai opté pour votre premier exemple de solution, car c'était le plus logique, avec la direction que j'avais déjà prise. Et j'apprécie toutes les informations supplémentaires pour m'aider à comprendre. Les autres réponses étaient également excellentes.


@ExecChef était heureux de vous aider! Vous pouvez également voter pour d'autres réponses;)



1
votes

Si je comprends bien votre objectif, vous pouvez combiner une requête Où avec N'importe quelle requête pour obtenir ce que vous recherchez en une seule fois avec Linq.

var openInternalTransactions =
    db.ICS_Transactions
        .Where(s => s.OpenClosed == "Open")
        .Where(s => s.TransType == "New Internal Order");

var openInternalTransactionsWithOrders =
    openInternalTransactions.Where(trans => 
        db.ICS_Orders.Any(order =>
            order.RequisitionNumber == trans.RequisitionNumber));

return View(openInternalTransactionsWithOrders);
  • Remarque: j'ai changé les noms des variables pour me faciliter la tâche. Je suis fan des noms descriptifs, même s'ils sont longs.


0 commentaires