2012-04-01 20 views
0

LINQ-SQLを使用してコードを記述した特定のシナリオがありますが、それはやります...しかし、問題は変換できません。誰かが私に手を差し伸べることができる?おかげSQLクエリをLINQ to Entitiesに変換する

ここでは、クエリ

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 

誰も私を助けることができるのですか?おかげ

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

でそれを行うのと同じよう

編集

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

はい、私のアプリケーションにSQLスクリプトを挿入するのは本当に好きではありませんが、私はlinqで作業することを好む:D – Mirko