2015-12-31 4 views
1

Довольно неожиданно для LINQ, и я пытаюсь выяснить, как написать конкретный запрос. У меня есть база данных, где каждая ЦЕПЬ состоит из одного или нескольких ЗАКАЗОВ, и каждый ЗАКАЗ состоит из одного или нескольких ЧАСТЕЙ. База данных выглядит следующим образом:LINQ Выражение для CROSS APPLY двух уровней глубоких

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?] 

Спасибо!

+0

Это может быть полезно: [linq cross apply] (http://stackoverflow.com/questions/9787482/how-do-i-write-this-cross-apply-query-in-linq-to-sql) – Alicia

+0

См. Следующую веб-страницу: https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b – jdweng

ответ

1

. [ЧТО ТЕПЕРЬ?]

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

Здесь c.Orders ли присоединиться к ChainOrder, а o.SelectMany(o => o.Partials) ли присоединиться к OrderPartial. Как только у вас есть доступ к записям Partial, вы можете использовать любую функцию агрегата, например Min(p => p.Date) в вашем случае.

+0

А, ладно, я понимаю. SelectMany является одним из наиболее запутанных выражений на первый взгляд, но ваше объяснение делает его очень ясным. Спасибо, Иван! – ekramer17

Смежные вопросы