使用表我有方便(因爲你沒有提供的模式),採用5如在LINQPad一個實際變量的佔位符:
var pabove = (from p in PolicyStatuses
where p.PolicyStatusID >= 5
orderby p.PolicyStatusID ascending
select p).Take(2);
var pbelow = (from p in PolicyStatuses
where p.PolicyStatusID <= 5
orderby p.PolicyStatusID descending
select p).Take(2);
pabove.Union(pbelow).Dump();
這將抓住一個的上方和下方之一。然而,需要注意的是返回null當你沒有找到一個排的上方或下方不發生在這裏,它只是排除了這樣的結果。如果你真正關心,你可以採取pabove的數量和pbelow檢測,如果這樣的記錄被發現。
(從我的架構顯然再次)結果:
IOrderedQueryable<PolicyStatus> (3 items)
PolicyStatusID Status RecordCreated
4
Unknown
8/26/2007 11:06:11 PM
5
Expired
8/26/2007 11:06:11 PM
6
Cancelled
8/26/2007 11:06:11 PM
需要注意的是4,5和6被發現。這比加載整個表格更有優勢,然後在您想要的結果附近選取結果。使用Take(2)只有3條記錄應該從SQL服務器到您的Web服務器。如果您的表格足夠小,只需使用排序查詢表格並過濾需要的內容即可。
這裏是LINQ產生的SQL(某些字段省略):
SELECT [t2].[PolicyStatusID], [t2].[Status], [t2].[RecordCreated]
FROM (
SELECT TOP (2) [t0].[PolicyStatusID], [t0].[Status], [t0].[RecordCreated]
FROM [PolicyStatus] AS [t0]
WHERE [t0].[PolicyStatusID] >= @p0
ORDER BY [t0].[PolicyStatusID]
UNION
SELECT TOP (2) [t1].[PolicyStatusID], [t1].[Status], [t1].[RecordCreated]
FROM [PolicyStatus] AS [t1]
WHERE [t1].[PolicyStatusID] <= @p1
ORDER BY [t1].[PolicyStatusID] DESC
) AS [t2]
你能展示一個代碼示例嗎?這將有所幫助。謝謝。 – Thomas