3

考虑以下虚构场景:

实体关系图

即使客户没有订购任何产品,我如何为每个客户获取所有类别的列表(不同的或其他的,没关系)?

还假设我们没有导航属性,所以我们需要使用手动连接。

这是我使用嵌套的尝试:

var customerCategories = from c in context.Customers
                         join o in context.Orders on c.CustomerId equals o.CustomerId into orders
                         select new
                         {
                             CustomerName = c.Name,
                             Categories = (from o in orders
                                           join p in context.Products on o.ProductId equals p.ProductId
                                           join cat in context.Category on p.CategoryId equals cat.CategoryId
                                           select cat)
                         };

是否有不同的(可能更好的方法)来实现相同的结果?

替代方案:多个左(组)连接

var customerCategories = from customer in context.Customers
                         join o in context.Orders on customer.CustomerId equals o.CustomerId into orders
                         from order in orders.DefaultIfEmpty()
                         join p in context.Products on order.ProductId equals p.ProductId into products
                         from product in products.DefaultIfEmpty()
                         join cat in context.Categories on product.CategoryId equals cat.CategoryId into categories
                         select new
                         {
                             CustomerName = c.Name,
                             Categories = categories
                         };
4

2 回答 2

2

我重新创建了您的表结构并添加了一些数据,以便更好地了解您要做什么。我找到了几种方法来完成你想要的,但我只是要添加这个方法。我认为这是最简洁的,我认为它很清楚。

代码

var summaries = Customers.GroupJoin(Orders,
    cst => cst.Id,
    ord => ord.CustomerId,
    (cst, ord) => new { Customer = cst, Orders = ord.DefaultIfEmpty() })
    .SelectMany(c => c.Orders.Select(o => new
        {
            CustomerId = c.Customer.Id,
            CustomerName = c.Customer.Name,
            Categories = Categories.Where(cat => cat.Id == c.Customer.Id)
        }));

输出

LINQ 输出

表结构

表结构

表数据

表数据

于 2013-08-05T13:34:44.010 回答
0

如果您需要所有类别,您不能:

Categories = (from c in context.Category 
                      select cat)
于 2013-08-03T09:40:21.303 回答