簡體   English   中英

需要幫助將SQL查詢轉換為LINQ語句以在我的ASP.NET MVC 3項目中使用

[英]Need help converting SQL query to LINQ statement for use in my ASP.NET MVC 3 project

這是我需要轉換為LINQ語句以在ASP.NET MVC 3項目中使用的查詢。 我對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 ");

如果您只是學習linq並想轉換這樣的復雜查詢,我建議您使用此工具

http://www.sqltolinq.com/

創建查詢作為sql視圖,說“ MyView”,然后從MVC項目中調用它。

return db.ExecuteStoreQuery<YourEntityType>("SELECT * FROM MyView");

如果僅將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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM