0

.NET アプリケーションで使用するこのような SQL コードを取得しました。LINQ には精通していますが、WITH ステートメントの処理方法がわかりません。

WITH records
AS
(
    SELECT  [key], [rev], [IsCurrent],
            ROW_NUMBER() OVER(PARTITION BY [key]
            ORDER BY CASE WHEN [rev] = @revNUm          
            THEN 0 ELSE 1 END) rn
    FROM    tableName
    WHERE   [Rev] IN (@revNUm,0)
)
SELECT  [key], [rev], [IsCurrent]
FROM    records 
WHERE   rn = 1

編集: ROW_NUMBER() も難しいようですが、どうすればいいですか?

ありがとう

4

3 に答える 3

1

パラメータrevが 0 または等しい各キー グループの最初のレコードを取得しているようです。revnumあなたはLinqでそれを行うことができます:

 var query = db.records
               .OrderBy(r => r.rev == revNum ? 0 : 1)
               .Where(r => rev == 0 || rev == revNum)
               .GroupBy(r => r.key)
               .Select(g => g.First());

レコードにクエリの 3 つのフィールドよりも多くのフィールドが含まれている場合は、追加するだけです

               .Select(r => new {r.key, r.rev, r.IsCurrent})
于 2013-04-12T13:51:05.700 に答える
0

クエリをストアド プロシージャとして保存し、LINQ を使用してストアド プロシージャを呼び出します (こちらを参照してください: http://msdn.microsoft.com/en-us/library/bb918119.aspx )。このようなもの:

CREATE PROCEDURE newprocedure
@revNUm INT
AS    
BEGIN
WITH records
AS
(
    SELECT  [key], [rev], [IsCurrent],
            ROW_NUMBER() OVER(PARTITION BY [key]
            ORDER BY CASE WHEN [rev] = @revNUm          
            THEN 0 ELSE 1 END) rn
    FROM    tableName
    WHERE   [Rev] IN (@revNUm,0)
)
SELECT  [key], [rev], [IsCurrent]
FROM    records 
WHERE   rn = 1
END
于 2013-04-12T13:42:52.883 に答える
0

コードからインライン テーブル値関数を作成する

CREATE FUNCTION YourFunction
(   
)
RETURNS TABLE 
AS
RETURN 
(
WITH records
AS
(
    SELECT  [key], [rev], [IsCurrent],
            ROW_NUMBER() OVER(PARTITION BY [key]
            ORDER BY CASE WHEN [rev] = @revNUm          
            THEN 0 ELSE 1 END) rn
    FROM    tableName
    WHERE   [Rev] IN (@revNUm,0)
)
SELECT  [key], [rev], [IsCurrent]
FROM    records 
WHERE   rn = 1
)
GO

この関数を DBML デザイナーにドロップします。このようにして、最速の実行時間と最も簡単な実装方法が得られます。

于 2013-04-12T15:25:16.417 に答える