En utilisant une table que j'avais à portée de main (comme vous avez fourni aucun schéma), en utilisant 5 comme un espace réservé pour une variable réelle 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();
Cette saisira au-dessus et un en dessous. Notez cependant que le retour de null ne se produit pas ici quand vous ne trouvez pas une ligne au-dessus ou au-dessous, il exclut simplement de tels résultats. Si vous vous souciez vraiment, vous pouvez prendre le compte de pabove et pbelow pour détecter si un tel enregistrement a été trouvé.
Le résultat (évidemment à nouveau de mon schéma):
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
Notez que 4, 5 et 6 ont été trouvés. Cela a un avantage sur le chargement de la table entière et la sélection des résultats près de celui que vous voulez. En utilisant Take (2), seulement 3 enregistrements doivent traverser le fil de votre serveur SQL vers votre serveur Web. Si votre table est suffisamment petite, il vous suffit d'interroger la table avec un tri et de filtrer ce dont vous avez besoin.
Voici le SQL produit par LINQ (certains champs omis):
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]
Pouvez-vous montrer un exemple de code? Cela serait utile. Merci. – Thomas