2012-04-01 2 views
0

LINQ-SQL을 사용하여 코드를 작성했지만 특정 작업을 수행 할 수는 있지만 문제는 변환 할 수 없다는 것입니다. 누구든지 내게 손을 줄 수 있습니까? 여기 SQL 쿼리를 엔터티로 LINQ로 변환

감사

쿼리

INSERT

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 

이 사람이 나를 도울 수있다? 감사합니다

편집 : 결과 쿼리

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

와 함께 할 것 같은

편집

create view dbo.vwEmployeeCosts as ;WITH cte AS ( ... ) select * ... from 

그런 다음 모델이지도보기. 보기/저장 프로 시저를 만들거나 수동으로 SQL 쿼리를 실행하거나 먼저 로컬 컴퓨터에 데이터를 가져 와서 linq를 개체에 사용할 수 있습니다. – Polity

+0

이해합니다. 내 쿼리에서 cte 값을 삭제하면 엔티티로 linq로 변환 할 수 있습니까? – Mirko

+0

EF /와 Linq를 조합하여 쿼리를 개체와 비슷하게 만들 수 있습니다. 그러나 성능 차이는 엄청납니다 (EF는 PARTITION BY를 지원하지 않으므로 수동으로해야합니다). 원하는 결과에 대한 추상적 인 설명을 제공하면이를 기반으로 예제를 만들 수 있습니다. – Polity

답변

0

나는 CTE 문에 전달 될 필요가있는 매개 변수를 볼 수 없습니다, 그래서 당신 create a view 수 및 모델에 매핑합니다.

그런 다음 다른 테이블과 마찬가지로보기에 액세스 할 수 있습니다. 당신은 내가 당신이 EF에서 CTE를 사용할 수 있다고 생각하지 말아 테이블

+0

네,하지만이 코드를 linq로 변환하는 방법을 모르겠습니다./ – Mirko

+0

나는 당신을 따라 가지 않을 것이라고 생각합니다. 뷰를 작성한 후 뷰를 모델에 추가 할 수 있습니다. –

+0

네,보기와 함께 작동하므로이 코드를 LINQ로 변환 할 필요는 없습니다. 그러나 실제로 응용 프로그램에 SQL 스크립트를 삽입하지 않습니다. 나는 linq을 사용하는 것을 선호합니다 : D – Mirko