使用LINQ获取实际项目之前和之后的行

时间:2009-10-08 15:25:03

标签: asp.net-mvc linq

我目前有一个带有以下ActionResult的控制器

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

        return View("Details", p);
    }

我想扩展LINQ查询以返回产品之前以及产品之后的视图。因此,我现在不返回一种产品,而是返回三种产品。

  1. 产品之前(如果之前没有产品,则为null)
  2. SKU已知的产品
  3. 产品之后(如果之后没有产品,则为null)
  4. 任何帮助都将受到高度赞赏。

    由于

3 个答案:

答案 0 :(得分: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服务器到您的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]

答案 1 :(得分:0)

将View更改为Dictionary类型,并返回包含Previous,Current,Next键的字典。填充存储库中的值。在View中,将Dictionary中的值检查为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从repo获取项目的代码有不同的答案。我说你会做类似以下的事情让他们进入视图

并且视图将具有以下

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

<% if (Model.ContainsKey("Previous")) { %><%=Model["Previous"] %><% } %>

答案 2 :(得分:0)

您需要先确定产品的订单,然后才能确定哪种产品出现在其他产品之前或之后。

定义订单后,您可以执行类似于@Godeke建议的操作。

订单完全取决于您,但应该对用户有所帮助。按ID列排序可能不是正确的方法。按名称/显示名称,添加日期,最低价格等排序将有意义。

更好的是,允许用户定义订单。