我是 linq 的新手,无法编写两个简单的查询。出于某种原因,我无法将头环绕在它周围。

它的结构很简单:一个订单有订单项。每个 orderItem 都有一个 productID。

我想:

  • 获取所有订购 productId 3 的订单
  • 获取在同一订单上订购 productId 4 和 5 的所有订单。

  • 我已经尝试了很多方法。这两个查询位于小测试应用程序的底部。
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace test
    {
        class Program
        {
            static void Main(string[] args)
            {
                OrderService svc = new OrderService();
    
                //find all orders that purchased ProductID 3
                IEnumerable<Order> data = svc.GetOrdersWithProduct(3);
    
                //find all orders that purchase product 4 AND 5
                IEnumerable<Order> data2 = svc.GetOrdersWithProduct(new int[] { 4, 5} );
            }
        }
    
        public class Order
        {
            public int OrderId { get; set; }
            public IEnumerable<OrderItem> Items { get; set; }
        }
    
        public class OrderItem
        {
            public int OrderItemId { get; set; }
            public int OrderId { get; set; }
            public int ProductId { get; set; }
        }
    
        public class OrderService
        {
            private static List<Order> GetTestData()
            {
                List<Order> orders = new List<Order>();
    
                //5 Orders, 3 items each (every orderitem has a unique product in this test set)
                int orderitemid = 1;
                int productid = 1;
                for (int orderid = 1; orderid < 6; orderid++)
                {
                    orders.Add(new Order
                    {
                        OrderId = orderid,
                        Items = new List<OrderItem>
                                                    {
                                                        new OrderItem() { OrderId = orderid, OrderItemId = orderitemid++, ProductId = productid ++ },
                                                        new OrderItem() { OrderId = orderid, OrderItemId = orderitemid++, ProductId = productid ++ },
                                                        new OrderItem() { OrderId = orderid, OrderItemId = orderitemid++, ProductId = productid ++ }
                                                    }
                    });
    
                }
                return orders;
            }
    
            public IEnumerable<Order> GetOrdersWithProduct(int productId)
            {
                List<Order> orders = OrderService.GetTestData();
    
                // ??   not really what i want, since this returns only if all items are the same
                var result = orders.Where(o => o.Items.All(i => i.ProductId == productId));
    
                return result.ToList();
            }
    
            public IEnumerable<Order> GetOrdersWithProduct(IEnumerable<int> productIds)
            {
                List<Order> orders = OrderService.GetTestData();
    
                //??
                var result = orders.Where(o => o.Items.All(productIds.Contains(i => i.ProductId)));
    
                return result.ToList();
            }
        }
    }
    

    最佳答案

    我会这样做:

  • 获取所有订购 productId 3 的订单
    var result = orders.Where(o => o.Items.Any(item => item.ProductId == 3));
    
  • 获取所有订购 productId 4 和 5 的订单
    var result = orders.Where(o => o.Items.Any(item => item.ProductId == 4))
                       .Where(o => o.Items.Any(item => item.ProductId == 5));
    

  • 或者:
    public static IEnumerable<Order> GetOrdersWithProduct(int id)
    {
        return orders.Where(o => o.Items.Any(item => item.ProductId == productId));
    }
    

    然后:
    var result1 = GetOrdersWithProduct(3);
    var result2 = GetOrdersWithProduct(4).Intersect(GetOrdersWithProduct(5));
    

    另一种选择:
    public static IEnumerable<Order> GetOrdersWithProducts(params int[] ids)
    {
        return GetOrdersWithProducts((IEnumerable<int>) ids);
    }
    
    public static IEnumerable<Order> GetOrdersWithProducts(IEnumerable<int> ids)
    {
        return orders.Where(o => !ids.Except(o.Items.Select(p => p.ProductId))
                                     .Any());
    }
    
    var result1 = GetOrdersWithProducts(3);
    var result2 = GetOrdersWithProduct(4, 5);
    

    关于c# - 如何通过子属性查询 LINQ 中的对象集合?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1574626/

    10-13 03:15