我如何在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);
谢谢你的帮助。
看起来真的很接近。我认为您需要在最终语句(您的"联合")周围添加一组额外的括号(以便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);