0

これは、ASP.NET MVC 3 プロジェクト内で使用するために LINQ ステートメントに変換する必要があるクエリです。私はまだ LINQ に慣れていないので、助けが必要です。

WITH CTE AS (
  SELECT a.GalleryID GalleryID_A, a.GalleryTitle, a.GalleryDate, b.*
        ,ROW_NUMBER() OVER (PARTITION BY a.GalleryID, a.GalleryTitle, a.GalleryDate
                            ORDER BY b.MediaThumb DESC) AS Rn
    FROM Media b
         INNER JOIN Galleries A ON a.GalleryID = b.GalleryID
),

CTE2 AS (
  SELECT a.GalleryID GalleryID_A, a.GalleryTitle, a.GalleryDate, b.*, 1 Rn
   FROM Media b
        LEFT OUTER JOIN Galleries A ON a.GalleryID = b.GalleryID
)

SELECT * FROM CTE where rn = 1

UNION ALL

SELECT * FROM CTE2
  WHERE rn = 1
    AND galleryid is null

ORDER BY MediaID DESC

これが私の解決策でした。

var Results = DB.Database.SqlQuery<WhatsNew>
                (@" WITH CTE AS (
                    SELECT a.GalleryTitle, a.GalleryDate, b.*,  
                    ROW_NUMBER() OVER (PARTITION BY  a.GalleryID, a.GalleryTitle, a.GalleryDate 
                    ORDER BY b.MediaThumb DESC) AS Rn
                    FROM Media b
                    INNER JOIN Galleries A
                    ON a.GalleryID = b.GalleryID
                ), 
                CTE2 AS
                (
                    SELECT a.GalleryTitle, a.GalleryDate, b.*,  
                    1 Rn
                    FROM Media b
                    LEFT OUTER JOIN Galleries A
                    ON a.GalleryID = b.GalleryID
                )
                SELECT * FROM CTE where rn = 1
                UNION ALL
                SELECT * FROM CTE2 WHERE rn = 1 and galleryid is null
                ORDER BY MediaID DESC ");
4

3 に答える 3

1

linq を学習していて、このような複雑なクエリを変換したい場合は、このツールの使用をお勧めします

http://www.sqltolinq.com/

于 2012-08-25T04:26:36.187 に答える
1

クエリをSQLのビューとして作成し、「MyView」と言って、MVCプロジェクトから呼び出します。

return db.ExecuteStoreQuery<YourEntityType>("SELECT * FROM MyView");
于 2012-08-25T21:31:06.977 に答える
0

ページングのみに CTE を使用している場合は、Skip()およびTake()拡張機能を使用できます。

var page = (from a in _context.Set<Media>()
    orderby a.GalleryID, a.GalleryTitle, a.GalleryDate
    select a)
    .Skip(page * size).Take(size);

またはPagedListを使用します。

var page = (from a in _context.Set<Media>()
    orderby a.GalleryID, a.GalleryTitle, a.GalleryDate
    select a)
    .ToPagedList(page, size);
于 2012-08-27T18:12:16.673 に答える