Avec le code suivant, comment puis-je joindre des éléments ensemble.C# joindre des éléments qui sont les mêmes avec l'expression lambda
var shippedItems = _orderService.GetOrderById(shipment.OrderId).Shipments
.Where(x => x.ShippedDateUtc != null && x.OrderId == shipment.OrderId)
.Select(x => x.ShipmentItems)
.ToList();
Il peut donc y avoir deux envois ou plus pour l'ID de la commande. Chaque envoi peut contenir des articles identiques.
Besoin d'un petit coup de pouce dans la bonne direction
Ont essayé
var shippedItems = _orderService.GetOrderById(shipment.OrderId).Shipments
.Where(x => x.ShippedDateUtc != null && x.OrderId == shipment.OrderId)
.Select(x => x.ShipmentItems.Join(x.ShipmentItems
.Where(y => y.ShipmentId == shipment.Id)))
.ToList();
et
var shippedItems = _orderService.GetOrderById(shipment.OrderId).Shipments
.Where(x => x.ShippedDateUtc != null && x.OrderId == shipment.OrderId)
.Select(x => x.ShipmentItems.GroupBy(y => y.Id))
.ToList();
et
var shippedItems = _orderService.GetOrderById(shipment.OrderId).Shipments
.Where(x => x.ShippedDateUtc != null && x.OrderId == shipment.OrderId)
.Select(x => x.ShipmentItems.Distinct())
.ToList();
est le code J'utilise ici pour la sortie les articles:
foreach (var shipmentItem in shippedItems)
{
System.Diagnostics.Debug.WriteLine("item = " + shipmentItem);
System.Diagnostics.Debug.WriteLine("item = " + shipmentItem.OrderItemId);
}
La sortie ci-dessus produit:
nombre de shippedItemsList = 9 item = System.Data.Entity.DynamicProxies.ShipmentItem_18BEAAFA747B42988EC4CB25D967298CC6736AF528389FC98E81143F7D629631 item = 356077
item = System.Data.Entity. DynamicProxies.ShipmentItem_18BEAAFA747B42988EC4CB25D967298CC6736AF528389FC98E81143F7D629631 item = 356078
item = System.Data.Entity.DynamicProxies.ShipmentItem_18BEAAFA747B42988EC4CB25D967298CC6736AF528389FC98E81143F7D629631 item = 356079
item = System.Data.Entity.DynamicProxies.ShipmentItem_18BEAAFA747B42988EC4CB25D967298CC6736AF528389FC98E81143F7D629631 item = 356077
item = System.Data.Entity.DynamicProxies. ShipmentItem_18BEAAFA747B42988EC4CB25D967298CC6736AF528389FC98E81143F7D629631 item = 356078
item = System.Data.Entity.DynamicProxies.ShipmentItem_18BEAA FA747B42988EC4CB25D967298CC6736AF528389FC98E81143F7D629631 item = 356079
item = System.Data.Entity.DynamicProxies.ShipmentItem_18BEAAFA747B42988EC4CB25D967298CC6736AF528389FC98E81143F7D629631 item = 356077
item = System.Data.Entity.DynamicProxies.ShipmentItem_18BEAAFA747B42988EC4CB25D967298CC6736AF528389FC98E81143F7D629631 item = 356079
item = System.Data.Entity.DynamicProxies.ShipmentItem_18BEAAFA747B42988EC4CB25D967298CC6736AF528389FC98E81143F7D629631 item = 356080
Ainsi, la sortie doit être exceptés:
nombre shippedItemsList = 4 item = System.Data.Entity.DynamicProxies.ShipmentItem_18BEAAFA747B42988EC4CB25D967298CC6736AF528389FC98E81143F7D629631 item = 356077
item = System.Data.Entity.DynamicProxies.ShipmentItem_18BEAAFA747B42988EC4CB25D967298CC6736AF528389FC98E81143F7D629631 item = 356079
item = System.Data.Entity.DynamicProxies.ShipmentItem_18BEAAFA747B42988EC4CB25D967298CC6736AF528389FC98E81143F7D629631 item = 356078
item = System.Data.Entity.DynamicProxies.ShipmentItem_18BEAAFA747B42988EC4CB25D967298CC6736AF528389FC98E81143F7D629631 item = 356080
ci-dessus la sortie est en utilisant var shippedItems = _orderService.GetOrderById(shipment.OrderId).Shipments.Where(x => x.ShippedDateUtc != null && x.OrderId == shipment.OrderId).SelectMany(x => x.ShipmentItems).ToList();
NOTE: l'article d'expédition est ICollection<ShipmentItem> Shipment.ShipmentItems
quand je passe la souris dans visual studio
MISE À JOUR senario:
Alors disons que l'ordre a 3 points (a = 3, b = 5, c = 3), maintenant 1 expédition est envoyé avec les éléments (a = 1, b = 2, c = 0), Une deuxième expédition est maintenant envoyée avec les items (a = 1, b = 1, c = 1). Je voudrais la quantité d'articles des deux expéditions. Donc j'attends des items (a = 2, b = 3, c = 1), j'obtiens actuellement des items (a = 1, b = 2) + des items (a = 1, b = 1, c = 1). Ainsi, la liste des envois que j'emprunte traverse apparaissent plus d'une fois.
Je pensais que peut-être l'union, mais ne savez pas comment mettre ensemble:/
MISE À JOUR MON SOLUTION
je ne pouvais pas arriver à cette fin en utilisant l'expression lambda, donc je dû faire ce qui suit solution pour obtenir le résultat que je voulais. J'espère que cela aide les autres à la recherche de solutions de contournement.
//calculate quantity of total shipped items from each shipment List<ShipmentItem> alreadyShippedItemsList = new List<ShipmentItem>(); Dictionary<int, int> alreadyShippedItems = new Dictionary<int, int>(); var shippedItems = _orderService.GetOrderById(shipment.OrderId).Shipments .Where(x => x.ShippedDateUtc != null) .SelectMany(x => x.ShipmentItems) .ToList(); //create a list of shipment items for (int i = 1; i <= shipmentsList.Count - 1; i++) { var si = shipmentsList[i]; var sii = si.ShipmentItems.ToList(); foreach (var item in sii) { var itemInList = alreadyShippedItemsList.Where(x => x.OrderItemId == item.OrderItemId).FirstOrDefault(); int sum = 0; //create a list of shipment items and check for duplicate items if (itemInList == null) { alreadyShippedItems.Add(item.OrderItemId, item.Quantity); alreadyShippedItemsList.Add(item); } else { //if duplicate item is found update the quantity in the dictionary sum = itemInList.Quantity + item.Quantity; alreadyShippedItems[item.OrderItemId] = sum; } } }
Selon vos besoins, est-ce "Joindre", ou "Union". Perharp si vous pouvez fournir vos données, et votre sortie requise, il devrait être plus facile pour nous – Jacky
@Jacky voir ma question mise à jour, ont ajouté la sortie requise. –
@ Sujit.Warrier donc 1 commande peut avoir 3 expéditions, chaque expédition peut avoir n'importe quel nombre d'articles de la commande. –