我目前有一个带有以下ActionResult的控制器
public ActionResult Details(string sku)
{
Product p = _productRepository.GetProduct(sku);
return View("Details", p);
}
我想扩展LINQ查询以返回产品之前以及产品之后的视图。因此,我现在不返回一种产品,而是返回三种产品。
任何帮助都将受到高度赞赏。
由于
答案 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列排序可能不是正确的方法。按名称/显示名称,添加日期,最低价格等排序将有意义。
更好的是,允许用户定义订单。