gpt4 book ai didi

c# - 如何通过子属性查询 LINQ 中的对象集合?

转载 作者:行者123 更新时间:2023-11-30 20:13:27 25 4
gpt4 key购买 nike

我是 linq 的新手,在编写两个简单的查询时遇到了问题。出于某种原因,我无法全神贯注。

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

我愿意:

  1. 获取所有订购了productId 3的订单

  2. 获取在同一订单上订购 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();
}
}
}

最佳答案

我会这样做:

  1. 获取所有订购了productId 3的订单

    var result = orders.Where(o => o.Items.Any(item => item.ProductId == 3));
  2. 获取所有订购了 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com