繁体   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