2012-04-01 2 views
0

У меня есть конкретный сценарий, когда я написал свой код с использованием 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 
+0

, котор я не верю, что вы можете использовать КТР в EF. Вы можете либо создать View/Stored процедуру, выполнить запрос sql вручную, либо перенести данные на локальный компьютер и использовать linq для объектов. – Polity

+0

Я понимаю. Если я удалю из моего запроса значение cte, могу ли я преобразовать его в linq в сущности? – Mirko

+0

Вы можете подобрать запрос в сочетании EF/Linq с объектами. Однако разница в производительности будет огромной (EF не поддерживает PARTITION BY, например, так что вам нужно сделать это вручную). Если вы дадите нам абстрактное описание желаемого результата, тогда мы можем построить пример, основанный на этом. – Polity

ответ

0

Я не вижу каких-либо параметр, который должен быть принят на заявление КТР, так что вы можете create a view и отобразить его в модели.

Затем вы можете получить доступ к представлению, как и любой другой таблице.

редактировать

create view dbo.vwEmployeeCosts as 

;WITH cte AS (
    ... 
) 
select * 
    ... 
from 

Затем отображающих этот вид в модели, как вы могли бы сделать это с таблицей

+0

Да, но я не знаю, как преобразовать этот код в linq:/ – Mirko

+0

Не думаю, что я последую за вами. После создания представления вы можете добавить его в модель. Вам не нужно преобразовывать этот код в LINQ, так как будет работать с представлением –

+0

Да, но мне не очень нравится вставлять sql-скрипт в мое приложение, я предпочитаю работать с linq: D – Mirko