CROSS APPLY 两层深度的 LINQ 表达式

LINQ Expression for CROSS APPLY two levels deep

对 LINQ 相当陌生,正在尝试弄清楚如何编写特定查询。我有一个数据库,其中每个 CHAIN 由一个或多个 ORDERS 组成,每个 ORDER 由一个或多个 PARTIALS 组成。数据库如下所示:

CREATE TABLE Chain
(
ID         int            NOT NULL  PRIMARY KEY CLUSTERED IDENTITY(1,1),
Ticker     nvarchar(6)    NOT NULL,
Company    nvarchar(128)  NOT NULL
)
GO

CREATE TABLE [Order]
(
ID      int             NOT NULL  PRIMARY KEY CLUSTERED   IDENTITY(1,1),
Chart   varbinary(max)  NULL,
-- Relationships
Chain   int             NOT NULL
)
GO

ALTER TABLE dbo.[Order] ADD CONSTRAINT FK_Order_Chain 
    FOREIGN KEY (Chain) REFERENCES dbo.Chain ON DELETE CASCADE
GO

CREATE TABLE Partial
(
ID           int     NOT NULL  PRIMARY KEY CLUSTERED IDENTITY(1,1),
Date         date    NOT NULL,
Quantity     int     NOT NULL,
Price        money   NOT NULL,
Commission   money   NOT NULL,
-- Relationships
[Order]       int     NOT NULL
)
GO

ALTER TABLE dbo.Partial ADD CONSTRAINT FK_Partial_Order
    FOREIGN KEY ([Order]) REFERENCES dbo.[Order] ON DELETE CASCADE

我想检索链,按每个特定链的所有订单的所有部分中最早的日期排序。在 T-SQL 中,我会这样写查询:

SELECT p.DATE, c.*
FROM   CHAIN c
CROSS  APPLY
(
    SELECT DATE = MIN(p.Date)
    FROM   PARTIAL p
    JOIN   [ORDER] o
      ON   p.[ORDER] = o.ID
    WHERE  o.CHAIN = c.ID
) AS p
ORDER BY p.DATE ASC 

我有一个 Entity Framework 上下文,其中包含一个 DbSet、一个 DbSet 和一个 DbSet。如何完成这条语句才能得到我想要的结果?:

IEnumerable<Chain> chains = db.Chains
                              .Include(c => c.Orders.Select(o => o.Partials))
                              .[WHAT NOW?]

谢谢!

.[WHAT NOW?]

.OrderBy(c => c.Orders.SelectMany(o => o.Partials).Min(p => p.Date))

此处 c.OrdersChain 连接到 Order,而 o.SelectMany(o => o.Partials)Order 连接到 Partial。一旦您有权访问 Partial 记录,您就可以使用任何聚合函数,例如您的 Min(p => p.Date)