2009-10-08 1 views
-1

я в настоящее время есть контроллер со следующим ActionResultFetch строки до и после фактического элемента с помощью LINQ

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

     return View("Details", p); 
    } 

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

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

Любая помощь будет высоко оценили.

Благодаря

ответ

0

Изменение вида быть словарь типа, и возвращает словарь с ключами предыдущий, текущий, следующий. Заполните значения из вашего репозитория. В представлении «Просмотр» значения из словаря должны иметь значение NULL и, возможно, иметь элемент управления для отображения 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"] %><% } %> 
+0

Можете ли вы показать пример кода? Это было бы полезно. Благодарю. – Thomas

1

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

Вот 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

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

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

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

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

Смежные вопросы