我如何在LINQ格式重写这个SQL查询

本文关键字:SQL 查询 重写 格式 LINQ | 更新日期: 2023-09-27 18:15:03

我有一个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);

谢谢你的帮助。

我如何在LINQ格式重写这个SQL查询

看起来真的很接近。我认为您需要在最终语句(您的"联合")周围添加一组额外的括号(以便Take(1)仅适用于最后一个语句,而不是到该点的整个联合LINQ语句)和最后的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);

考虑将其分成单独的行,以便更清晰:

var lessThan8000 = (from m in DB.Media
                    where m.MediaTypeID == 1
                       && m.MediaID < 8000
                    orderby m.MediaID descending select m).Take(1);
var equalTo8000 = (from m in DB.Media
                   where m.MediaID == 8000
                   select m);
var greaterThan8000 = (from m in DB.Media
                       where m.MediaTypeID == 1
                          && m.MediaID > 8000
                       select m).Take(1));
var Results = lessThan8000.Union(equalTo8000)
                          .Union(greaterThan8000)
                          .OrderBy(m => m.MediaId);