简体   繁体   中英

Remove items from a List that are in another List by specific property with grouping

I have two lists

List A (CG300019159, CG300018158, FS300076458)
List B Returns grouped lists like below
     {
            "pallet_identifier": "CG300018158",
            "shipment_items": [
                {
                    "sku": "10366960",
                    "stock_qty": 12,
                    "description": "MOTHERCARE CREAM BABYGROW W/HAT"
                },
                {
                    "sku": "10346788",
                    "stock_qty": 1,
                    "description": "KIT 7PC ESS CREW NECK CARDIGAN SKY BLUE"
                }
    ]
    },
    "pallet_identifier": "CG300018187",
            "shipment_items": [
                {
                    "sku": "10366960",
                    "stock_qty": 12,
                    "description": "MOTHERCARE CREAM BABYGROW W/HAT"
                },
                {
                    "sku": "10346788",
                    "stock_qty": 1,
                    "description": "KIT 7PC ESS CREW NECK CARDIGAN SKY BLUE"
                }
    ]
    },

I want to remove the pallet and its contents from List B using the property pallet_identifier.

Tried like below

entity = new List<GoodInWarehouseBM>((from consighdrs in mi9db.consighdrs
                        join consigdests in mi9db.consigdests on consighdrs.consignment equals consigdests
                            .consignment
                        join consigliness in mi9db.consiglines on consigdests.condestint equals consigliness
                            .condestint
                        join productcodess in mi9db.productcodes on consigliness.varint equals productcodess.varint
                        join products in mi9db.products on productcodess.prodint equals products.prodint
                        where consigdests.destination == storeId && consighdrs.status == "T" && consighdrs.warehouse == "900"
                        group new { consigdests, productcodess, consigliness, products } by consigdests.consignment into grp
                        select new GoodInWarehouseBM
                        {
                            pallet_identifier = grp.Key,
                            shipment_items = grp.Select(a => new GoodInWarehouseBM.ShipmentItems
                            {
                                sku = a.productcodess.variantcode,
                                stock_qty = a.consigliness.issueqty,
                                description = a.products.proddesc

                            }).ToList()

                        }).ToList().RemoveAll(i => !getConsignmentbookedin.Contains(i.pallet_identifier)));

You can try to use .Where(i=> getConsignmentbookedin.Any(z=> z != i.pallet_identifier))

entity = new List<GoodInWarehouseBM>((from consighdrs in mi9db.consighdrs
                        join consigdests in mi9db.consigdests on consighdrs.consignment equals consigdests
                            .consignment
                        join consigliness in mi9db.consiglines on consigdests.condestint equals consigliness
                            .condestint
                        join productcodess in mi9db.productcodes on consigliness.varint equals productcodess.varint
                        join products in mi9db.products on productcodess.prodint equals products.prodint
                        where consigdests.destination == storeId && consighdrs.status == "T" && consighdrs.warehouse == "900"
                        group new { consigdests, productcodess, consigliness, products } by consigdests.consignment into grp
                        select new GoodInWarehouseBM
                        {
                            pallet_identifier = grp.Key,
                            shipment_items = grp.Select(a => new GoodInWarehouseBM.ShipmentItems
                            {
                                sku = a.productcodess.variantcode,
                                stock_qty = a.consigliness.issueqty,
                                description = a.products.proddesc

                            }).ToList()

                        }).Where(i=> getConsignmentbookedin.Any(z=> z != i.pallet_identifier)).ToList();

You should apply the filter before the group and select, it will improve your query by a number of magnitudes since you are throwing off everything you don't need.

entity = new List<GoodInWarehouseBM>((from consighdrs in mi9db.consighdrs.Where(i=> !getConsignmentbookedin.Contains(i.Id(id of item not sure which one it is))
                        join consigdests in mi9db.consigdests on consighdrs.consignment equals consigdests
                            .consignment
                        join consigliness in mi9db.consiglines on consigdests.condestint equals consigliness
                            .condestint
                        join productcodess in mi9db.productcodes on consigliness.varint equals productcodess.varint
                        join products in mi9db.products on productcodess.prodint equals products.prodint
                        where consigdests.destination == storeId && consighdrs.status == "T" && consighdrs.warehouse == "900"
                        group new { consigdests, productcodess, consigliness, products } by consigdests.consignment into grp
                        select new GoodInWarehouseBM
                        {
                            pallet_identifier = grp.Key,
                            shipment_items = grp.Select(a => new GoodInWarehouseBM.ShipmentItems
                            {
                                sku = a.productcodess.variantcode,
                                stock_qty = a.consigliness.issueqty,
                                description = a.products.proddesc

                            }).ToList()

                        })).ToList();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM