Довольно неожиданно для 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?]
Спасибо!
Это может быть полезно: [linq cross apply] (http://stackoverflow.com/questions/9787482/how-do-i-write-this-cross-apply-query-in-linq-to-sql) – Alicia
См. Следующую веб-страницу: https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b – jdweng