Получить строки до и после фактического элемента с помощью LINQ - PullRequest
0 голосов
/ 08 октября 2009

У меня сейчас есть контроллер со следующим ActionResult

    public ActionResult Details(string sku)
    {
        Product p = _productRepository.GetProduct(sku);

        return View("Details", p);
    }

Я хотел бы расширить запрос LINQ, чтобы вернуть продукт до, а также продукт после просмотра. Поэтому вместо того, чтобы возвращать один товар, я бы сейчас вернул три товара.

  1. Товар до (ноль, если товара до этого нет)
  2. Продукт, чей SKU известен
  3. Товар после (пусто, если товара после нет)

Любая помощь будет принята с благодарностью.

Спасибо

Ответы [ 3 ]

1 голос
/ 08 октября 2009

Используя таблицу, которая мне пригодилась (поскольку вы не указали схемы), используя 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();

Это будет один выше и один ниже. Однако обратите внимание, что возвращение нулевого значения здесь не происходит, когда вы не находите строку выше или ниже, оно просто исключает такие результаты. Если вы действительно заботитесь, вы можете взять 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 к вашему веб-серверу. Если ваша таблица достаточно мала, просто запросите таблицу с сортировкой и отфильтруйте то, что вам нужно.

Вот SQL, созданный LINQ (некоторые поля опущены):

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]
0 голосов
/ 08 октября 2009

Вам необходимо определить заказ для ваших продуктов, прежде чем вы сможете определить, какой продукт идет до или после другого продукта.

Как только вы определили заказ, вы можете сделать что-то похожее на то, что предложил @Godeke.

Заказ полностью зависит от вас, но должен иметь некоторый смысл для пользователя. Упорядочение по столбцу идентификаторов, вероятно, не является правильным подходом. Будет иметь смысл упорядочение по имени / отображаемому имени, дате добавления, минимальной цене и т. Д.

Еще лучше, позвольте пользователю определить порядок.

0 голосов
/ 08 октября 2009

Измените View на тип Dictionary и верните словарь с ключами Previous, Current, Next. Заполните значения из вашего хранилища. В представлении проверьте значения из словаря, чтобы они были нулевыми и, возможно, имели элемент управления для отображения SKU (если он отображает более одного элемента данных.).

Dictionary<string, string> skuDictionary = new Dictionary<string, string>();
skuDictionary.Add("Previous", previousSKU);
skuDictionary.Add("Current", currentSKU);
skuDictionary.Add("Next", nextSKU);

        return View(skuDictionary);

Редактировать: код для использования LINQ для получения предметов из репо находится в другом ответе. Я говорил, что вы сделаете что-то вроде следующего, чтобы вывести их на экран

и представление будет иметь следующий вид

Inherits="System.Web.Mvc.ViewPage<System.Collections.Generic.Dictionary<string, string>>"

<% if (Model.ContainsKey("Previous")) { %><%=Model["Previous"] %><% } %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...