2012-04-01 109 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 

和现在可查询

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

我不相信你可以在EF使用CTE做到这一点。你可以创建一个视图/存储过程,手动执行sql查询,或者首先将数据提取到本地机器并使用linq到对象。 – Polity 2012-04-01 09:43:42

+0

我明白了。如果我从我的查询删除cte值,我可以将它转换为LINQ实体? – Mirko 2012-04-01 09:47:22

+0

您可以将EF /和Linq组合中的查询与对象进行比较。但是,性能差异将会很大(例如,EF不支持PARTITION BY,因此您必须手动执行)。如果你给我们一个你想要的结果的抽象描述,那么我们可以基于这个建立一个例子。 – Polity 2012-04-01 09:49:55

回答

0

我看不出这需要传递到CTE语句中的任何参数,这样你就可以create a view和模型映射。

然后您可以像访问其他表一样访问视图。

编辑

create view dbo.vwEmployeeCosts as 

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

然后在你的模型图这一观点,就像你有一张桌子

+0

是的,但我不知道如何将此代码转换为linq:/ – Mirko 2012-04-01 13:58:50

+0

我不认为我会关注你。创建视图后,可以将其添加到模型中。您不需要将此代码转换为LINQ,因为将与视图 – 2012-04-01 14:01:01

+0

一起工作是的,但我不太想在我的应用程序中插入sql脚本,我更喜欢使用linq:D – Mirko 2012-04-01 14:12:47