很抱歉,如果我真的不知道这个条款的话,我会尽力解释这个......
这就是我现在所拥有的
SELECT * FROM Products ORDER BY [Order]
Order ProductId Color
1 10 Black
2 59 Black
3 10 White
4 48 Black
(表格简化,真实表格约有30,000条记录)
但这就是我真正想要的东西
Order ProductId Color
1 10 Black
3 10 White
2 59 Black
4 48 Black
所以我希望它按[Order]排序,但保持相同的ProductId靠近,所以第3行应该向上移动到第一行,因为他们的ProductId是相同的(即10)
这是否可行? 如果在SQL Server查询中不可能,那么在LINQ中有没有简单的方法呢?
答案 0 :(得分:5)
几乎听起来像真的希望按顺序排序,主要是 - 您希望按产品ID和排序订购。所以:
SELECT * FROM Products ORDER BY ProductId, [Order]
在LINQ查询表达式中:
var results = from product in db.Products
orderby product.ProductId, product.Order
select product;
或:
var results = db.Products.OrderBy(p => p.ProductId).ThenBy(p => p.Order);
但是,如评论中所述,这将给最后两行的错误订单。
如果您真的在“使用订单作为主键,但随后在该组中以不同的顺序加息”,那么这有点棘手。我不确定你在寻找什么在SQL中很容易代表... ORDER BY
我真的假设你希望你的主要订购是一个真正的主要订购......
您可以在LINQ中尝试 - 我不知道等效的SQL是什么,或者它是否真的有用......
var results = db.Products
.OrderBy(g => g.Order)
.GroupBy(p => p.ProductId)
.SelectMany(g => g);
在LINQ to Objects中我相信会起作用 - 但目前还不清楚它是否会出现在LINQ to SQL中。
答案 1 :(得分:2)
如果您使用的是适度最新的SQL Server,这应该可以使用:
declare @t table ([Order] int not null,ProductId int not null,
Color char(5) not null)
insert into @t ([Order],ProductId,Color) values
(1,10,'Black'),
(2,59,'Black'),
(3,10,'White'),
(4,48,'Black')
select * from
(
select *,MIN([Order]) OVER (PARTITION BY ProductId) as Ord
from @t
) t
order by Ord,[Order]
对于每个ProductId
,我希望可读的是 - 对于每个Order
,使用ProductId
的最低Order
值作为主要排序键,然后使用该行的特定{{1}}值作为辅助排序键。
答案 2 :(得分:0)
我认为你的意思是这个 -
SELECT * FROM Products ORDER BY [ProductId] ASC, [Order] ASC
答案 3 :(得分:0)
试试这个:
SELECT * FROM Products ORDER BY ProductId, Order