我正在寻找一个优雅的解决方案来解决我遇到的订购问题。
我有一个数据库查询,它返回按名称排序的结果列表。结果将始终包含一个名为“Main Item”的项目,该项目始终需要首先出现在结果列表中。此项目不会被数据库中的单独字段标记,因此需要通过名称进行标识。
例如,如果结果如下:
"A Item"
"B Item"
"Main Item"
"Y Item"
"Z Item"
我需要按字母顺序排序,但除了“Main Item”首先出现之外:
"Main Item"
"A Item"
"B Item"
"Y Item"
"Z Item"
返回此数据的查询是用pl / sql编写的,我可以修改查询或在.Net端执行某些操作,其中我有一个包含结果对象集合的IEnumerable对象。
答案 0 :(得分:3)
您可以堆叠订单:
query
.OrderBy(item => item.Title) // alphabetical
.OrderByDescending(item => item.Title == "Main Item"); // put Main Item first, bool==true
修改强>
列表已预先排序,在该情况下只需要第二个OrderBy
query.OrderByDescending(item => item.Title == "Main Item");
答案 1 :(得分:0)
尝试此查询:
SELECT *
FROM MyTable
ORDER BY
CASE
WHEN Name = 'Main Item' THEN ' '
ELSE Name
END
答案 2 :(得分:0)
我喜欢payo的答案,但由于它第二次遍历整个集合而不是简单的元素移动逻辑,我认为发布这个答案也是合适的:
List<MyClass> items = GetItemsFromDB();
int i = items.FindIndex(x => x.Name == "Main Item");
MyClass mainItem = items[i];
items.RemoveAt(i);
items.Insert(0, mainItem);