简体   繁体   English

LINQ中的右外部联接到实体查询

[英]Right outer join in linq to entities query

Each Order make in some RoutingStep s, each step contains an Operation and each operation do in a Workshop . 每个Order在某些RoutingStep ,每个步骤都包含一个Operation ,每个工序都在Workshop

public class Order
{
   public int Id {get; set;}
   public string OrderNumber {get; set;}
   public virtual collection<Routing> Routings{get; set;}
}
public class Routing
{
   public int Id {get; set;}
   public virtual Order Order {get; set;}
   public virtual Operation Operation{get; set;}
}
public class Operation
{
   public int Id {get; set;}
   public virtual Workshop Workshop{get; set;}
}
public class Workshop
{
   public int Id {get; set;}
   public string Title {get; set;}
}

I want to write a linq to entity query(method syntax) to know each order pass which Workshop s and doesn't pass which Workshop s. 我想对实体查询(方法语法)编写一个linq,以了解每个订单传递了哪个Workshop而没有传递哪个Workshop In the other word if I have 4 Workshop s totally and O1 contains 3 Routing steps, I want following result for O1 : 换句话说,如果我总共有4个Workshop并且O1包含3个Routing步骤,那么我想要O1以下结果:

------------------------------
| Order  |  Workshop | status |
------------------------------
|   O1   |   W1      |  pass  |
------------------------------
|   O1   |   W2      |  pass  |
------------------------------
|   O1   |   W3      |not pass|
------------------------------
|   O1   |   W4      |  pass  |
-------------------------------

I write following code 我写下面的代码

var query = db.Orders
    .SelectMany(order=> order.Routings
    .Select(g => new
    {
        Number = g.Order.OrderNumber,
        Workshop = g.Operation.Workshop.Title,
        Status = g.????
    }).ToList();

Which code should I use instead "???" 我应该改用哪个代码“ ???” ?

var query = db.Orders
    .SelectMany(x => db.Workshops, (x, y) => new { Order = x, Workshop = y }) // all combinations of orders with workshops
    .GroupJoin( // left join to determine whether each combination actually exists
        db.Routings,
        x => x,  // proposed order-workshop pair
        y => new { Order = y.Order, Workshop = y.Operation.Workshop }, // existing order-workshop pair
        (x, ys) => new
        {
            x.Order.OrderNumber,
            x.Workshop.Title,
            Status = ys.Any() ? "pass" : "not pass"
        });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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