У меня есть конкретный сценарий, когда я написал свой код с использованием LINQ-SQL, но я бы сделал это ... но проблема в том, что я не могу его преобразовать! Может ли кто-нибудь дать мне руку? благодаряПреобразование SQL-запроса в LINQ to Entities
Вот запрос
ВСТАВИТЬ
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.Employe (
Id int NOT NULL PRIMARY KEY,
Name varchar(10) NOT NULL
);
CREATE TABLE dbo.Customer (
Id int NOT NULL PRIMARY KEY,
Name varchar(10) NOT NULL
);
CREATE TABLE dbo.Movement (
Id int NOT NULL IDENTITY PRIMARY KEY,
EmployeeId int NOT NULL,
CustomerId int NOT NULL,
Data date NOT NULL,
Time int NOT NULL,
SpecialCost decimal(18,4) NULL
);
CREATE TABLE dbo.EmployeeCost (
EmployeeId int NOT NULL,
Data date NOT NULL,
Value decimal(18,4) NOT NULL
);
GO
INSERT INTO dbo.Customer
VALUES (1, 'Cli1'), (2, 'Cli2'), (3, 'Cli3');
INSERT INTO dbo.Employe
VALUES (1, 'Mirko'), (2, 'Andrea');
INSERT INTO dbo.EmployeeCost
VALUES (1, '20110101', 1), (1, '20110701', 1.5), (1, '20120101', 2);
INSERT INTO dbo.EmployeeCost
VALUES (2, '20110101', 1), (2, '20120101', 1.3);
INSERT INTO dbo.Movement
VALUES (1, 1, '20110301', 2, NULL)
, (2, 1, '20110501', 1, NULL)
, (1, 1, '20110801', 1, NULL)
, (2, 1, '20111001', 1, NULL)
, (2, 1, '20120201', 1, 0.5);
GO
И СЕЙЧАС QUERY
USE tempdb;
GO
WITH cte AS (
SELECT c.EmployeeId, c.Data, c.Value
, ROW_NUMBER() OVER (PARTITION BY EmployeeId ORDER BY Data) AS [r]
FROM dbo.EmployeeCost c
),
cteCost AS (
SELECT ec.EmployeeId, ec.Data, ec.Value
, ISNULL(DATEADD(DAY, -1, c.Data), '20991231') AS NextDate
FROM cte ec
LEFT JOIN cte c ON ec.EmployeeId = c.EmployeeId
AND c.r = ec.r +1
)
SELECT c.Id, c.Name
, m.Data, d.Name, m.Time AS [Time], ec.Value AS [Cost per Hour], m.SpecialCost
, m.Time * ISNULL(m.SpecialCost, ec.Value) AS [Employe Cost]
FROM dbo.Customer c
JOIN dbo.Movement m ON m.CustomerId = c.Id
JOIN dbo.Employe d ON m.EmployeeId = d.Id
JOIN cteCost ec
ON ec.EmployeeId = m.EmployeeId
AND m.Data BETWEEN ec.Data AND ec.NextDate;
GO
Может кто-нибудь мне помочь? Благодаря
EDIT: РЕЗУЛЬТАТ QUERY
--<----------------
Id Customer Data Employe Time Cost per hour Total Cost
1 Cli1 2011-03-01 Mirko 2 1.0000 2.0000000000
1 Cli1 2011-05-01 Andrea 1 1.0000 1.0000000000
1 Cli1 2011-08-01 Mirko 1 1.5000 1.5000000000
1 Cli1 2011-10-01 Andrea 1 1.0000 1.0000000000
1 Cli1 2012-01-15 Mirko 1 2.0000
1 Cli1 2012-02-01 Andrea 1 1.3000 0.5000000000
, котор я не верю, что вы можете использовать КТР в EF. Вы можете либо создать View/Stored процедуру, выполнить запрос sql вручную, либо перенести данные на локальный компьютер и использовать linq для объектов. – Polity
Я понимаю. Если я удалю из моего запроса значение cte, могу ли я преобразовать его в linq в сущности? – Mirko
Вы можете подобрать запрос в сочетании EF/Linq с объектами. Однако разница в производительности будет огромной (EF не поддерживает PARTITION BY, например, так что вам нужно сделать это вручную). Если вы дадите нам абстрактное описание желаемого результата, тогда мы можем построить пример, основанный на этом. – Polity