需要帮助查询3个班级

时间:2015-09-22 16:54:07

标签: c# linq

我有3个类定义如下:

class Customer
{

    public string Name;
    public string City;
    public Order[] Orders;
}

class Order
{

    public int Quantity;
    public Product Product;
}

class Product
{

    public string ProdName;
    public decimal Price;
}

我想在C#中使用LINQ打印出购买特定产品的名称,在这种情况下,产品是' ProdName'。我无法找到解决方案,以便浏览所有这三个类,这些类可以根据产品名称给我命名。

我尝试过类似的东西,但它似乎不起作用:

var query = from c in customers where c.Order[0].Product.ProdName.Contains("Milk")
select c.Name;

foreach(var item in query)
{
   Console.WriteLine(item);
}

这就是我为每个类设置值的方法:

 static public List<Customer> GetCustomerList()
 {

    var customerList = new List<Customer>
    {
        new Customer {Name = "Johny", City = "London", Orders = new Order[3] },
        new Customer {Name = "Morgan", City = "Copenhagen", Orders = new Order[4]},
        new Customer {Name = "Rasmus", City = "Amsterdam", Orders = new Order[1] }
    };

    return customerList;
}

static public List<Order> GetOrderList()
{

    var orderList = new List<Order>
    {
        new Order { Quantity = 10, Product = new Product()},
        new Order { Quantity = 5, Product = new Product()},
        new Order { Quantity = 2, Product = new Product()}
    };

    return orderList;
}

static public List<Product> GetProductList()
{

    var productList = new List<Product>
    {
        new Product { Name = "Cookie, bread", Price = 50 },
        new Product { Name = "Cookie, Bread, Milk", Price = 85},
        new Product { Name = "bags", Price = 38}
    };

    return productList;
}

static void Main(string[] args)
{

    List<Customer> customers = GetCustomerList();
    List<Order> orders = GetOrderList();
    List<Product> products = GetProductList();
}

为了获得正确的结果,我怎样才能将所有3个类连接在一起?有什么提示吗?

2 个答案:

答案 0 :(得分:1)

您需要构建真实的相关测试数据。一些可用的虚假数据设置可能如下所示:

// Create a single instance of each Product that could be used
var egg = new Product { Name = "Eggs", Price = 2.0 };
var bread = new Product { Name = "Bread", Price = 3.0 };
var fooBars = new Product { Name = "FooBars", Price = 2.5 };

var customerList = new List<Customer>
{
    new Customer { Name = "Johny", City = "London", Orders = new List<Order> 
    {
        new Order { Quantity = 3, Product = bread },
        new Order { Quantity = 1, Product = egg },
        new Order { Quantity = 2, Product = fooBars }
    }},
    new Customer { Name = "Morgan", City = "Copenhagen", Orders = new List<Order>
    {
        new Order { Quantity = 30, Product = bread }
    }},
    new Customer { Name = "Rasmus", City = "Amsterdam", Orders = new List<Order>
    {
        new Order { Quantity = 12, Product = fooBars }
    }}
};

请注意,我使用List<Order>代替Order[],但您可以将其切换回来。我还在您的示例代码中显示了Name中的Product属性,但它与您的类定义不匹配。

现在你可以查询了。让我们看看谁买了面包:

var whoBoughtBread = customerList
    .Where(c => c.Orders.Any(o => o.Product == bread))
    .Select(c => c.Name);

或者

var whoBoughtBread2 = customerList
    .Where(c => c.Orders.Any(o => o.Product.Name == "Bread"))
    .Select(c => c.Name);

答案 1 :(得分:0)

使用数据结构,您将有一个查询:

customerList.Where(c => c.Orders.Any(o => o.Product.ProdName == prodName));

但正如评论中所述,您在集合中的null集合和null都有潜力。我强烈建议您确保具有非null元素的非null集合,以避免必须在查询中注入空值检查。否则你将不得不做一些像:

customerList.Where(c => c.Orders != null &&
                        c.Orders.Any(o => o != null &&
                                          o.Product != null &&
                                          o.Product.ProdName == prodName));

使用C#6的空传播运算符(?.),你可以将它缩短为 little

customerList.Where(c => c.Orders != null &&
                        c.Orders.Any(o => o?.Product != null &&
                                          o.Product.ProdName == prodName));