我需要运行一个LINQ查询,该查询将返回3行(当前记录、上一个记录和相对于当前记录的下一个记录。ProductID是我自动生成的标识列。
目前,我正在用一个Union LINQ语句来完成这项任务,但我不确定是否有更好或更有效的方法来完成同样的任务。
这是我得到的:
var ProductID = 10;
var Results = (from p in DB.Products
where p.ProductID == ProductID - 1 //Previous record.
select new Product
{
ProductID = p.ProductID,
ProductTitle = p.ProductTitle,
Views = p.Views,
}).Union(from p in DB.Products
where p.ProductID == ProductID //Current record
select new Product
{
ProductID = p.ProductID,
ProductTitle = p.ProductTitle,
Views = p.Views,
}).Union(from p in DB.Products
where p.ProductID == ProductID + 1 //Next record.
select new Product
{
ProductID = p.ProductID,
ProductTitle = p.ProductTitle,
Views = p.Views,
});
这应该会传回3个数据列,分别为ProductID 9、ProductID 10、ProductID 11。谢谢!
5条答案
按热度按时间tkqqtvp11#
就我个人而言,我会使用这种方法:它的好处是在范围内ID丢失的地方工作。一个勇敢的人假设所有的ID都被解释和存在。
a64a0gku2#
您的方法可以改写得更简短一些,如下所示:
但请注意,只有在没有从Products表中删除与指定productID对应的任何记录时,才会返回所需的内容。
nkkqxpd93#
GwynBleidd提出了一个很好的解决方案,但是你也可以指定一个ID列表,在你的例子中如下:
并在where子句中使用它
我认为这更通用,EF会将其转换为
WHERE [ProductID] IN (...)
,查询执行计划器可以很好地处理它。ds97pgxw4#
下面是我解决这个问题的方法--避免使用+1,-1。
在我的例子中,我试着显示上一个/下一个发布的博客文章。如果下一个/上一个博客文章是未发布的,+1,-1将不起作用。更不用说ID不总是连续的可能性了。
在您的情况下,您可能不想显示缺货产品。
这将返回
ProductId
与起始id
最接近的上一个和下一个产品。注意:如果列表已经按顺序排列,则不需要
.OrderBy(x => x.ProductId)
。lf5gs5x25#
以下是我的看法: