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;
3 Réponses :
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".
MyReqs
par var MyReqs = trans.RequsitionNumber;
et déplacez-le dans foreach
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); }
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;)
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);