如何以LINQ格式重写此SQL查询?

时间:2014-07-28 00:48:25

标签: c# sql sql-server linq linq-to-sql

我有一个sql查询,它返回给定ID的周围行。因此,假设我要为给定的MediaID为8000找到3行。(上一行,当前行,下一行)。

我甚至不确定这是否是实现这些结果的最佳方式,但无论如何这是我的查询:

SELECT * FROM (
    SELECT TOP 1 * FROM Media WHERE MediaTypeID = 1 and MediaID < 8000 order by MediaID DESC
    UNION
    SELECT * FROM Media WHERE MediaID = 8000
    UNION 
    SELECT TOP 1 * FROM Media WHERE MediaTypeID = 1 and MediaID > 8000
) AS TBL
ORDER BY TBL.MediaID

我将此查询导入C#Web应用程序,并希望将查询转换为LINQ格式。我有点挣扎。我想我很接近。

这是我的LINQ代码:

//Get Prev record, current record, next record
var Results = (from m in DB.Media where m.MediaTypeID == 1 && m.MediaID < 8000 orderby m.MediaID descending select m).Take(1).Union(
from m in DB.Media where m.MediaID == 8000 select m).Union(
from m in DB.Media where m.MediaTypeID == 1 && m.MediaID > 8000 select m).Take(1);

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

看起来非常接近。我认为你的“联合”最终语句周围需要一组额外的括号(因此Take(1)仅适用于最后一个语句而不是整个联合LINQ语句)和最后一个{{ 1}}:

OrderBy

为了清楚起见,请考虑将其拆分为单独的行:

var Results = (from m in DB.Media
               where m.MediaTypeID == 1
                  && m.MediaID < 8000
               orderby m.MediaID descending select m).Take(1)

            .Union(
               from m in DB.Media
               where m.MediaID == 8000
               select m)

            .Union(
               (from m in DB.Media
                where m.MediaTypeID == 1
                   && m.MediaID > 8000
                select m).Take(1))

            .OrderBy(m => m.MediaID);