3

我正在寻找一个优雅的解决方案来解决我遇到的订购问题。

我有一个数据库查询,它返回按名称排序的结果列表。结果将始终包含一个名为“主要项目”的项目,该项目始终需要首先出现在结果列表中。该项目没有由数据库中的单独字段标记,因此需要按名称标识。

例如,如果结果如下:

"A Item"
"B Item"
"Main Item"
"Y Item"
"Z Item"

我需要保留字母顺序,但“主要项目”除外:

"Main Item"
"A Item"
"B Item"
"Y Item"
"Z Item"

返回此数据的查询是用 pl/sql 编写的,我可以修改查询或在 .Net 端执行某些操作,其中我有一个 IEnumerable 对象,其中包含结果对象的集合。

4

3 回答 3

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");
于 2012-04-30T23:27:56.763 回答
0

试试这个查询:

SELECT * 
FROM MyTable 
ORDER BY 
        CASE 
            WHEN Name = 'Main Item' THEN ' ' 
            ELSE Name 
        END
于 2012-04-30T23:28:04.633 回答
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);
于 2012-05-01T00:15:19.520 回答