ServiceStack ormLite 更改 OrderBy

gon*_*ong 2 c# sql-order-by ormlite-servicestack

我正在努力做到以下几点:

var routines = con.Select<Table>(con.From<Table>().OrderBy(p => p.Field1).ThenBy(i => i.Field2));
Run Code Online (Sandbox Code Playgroud)

以上工作完美。但我想要一种更通用的方法并解析像 sort="field1,field2" 这样的字符串。我有以下代码:

int sortFieldCount = 0;
var itemsq = con.From<Table>();
foreach (var name in orderByField.Split(',')) {
if(sortFieldCount == 0)
  itemsq = sortOrderAscending ? itemsq.OrderBy(name) : itemsq.OrderByDescending(name);
else
   itemsq = sortOrderAscending ? itemsq.ThenBy(name) : itemsq.ThenByDescending(name);
sortFieldCount++;
}
Run Code Online (Sandbox Code Playgroud)

但是上面的代码似乎覆盖了第一个 OrderBy。有没有办法解决这样的问题?

谢谢

myt*_*thz 6

您可以使用ServiceStack.OrmLite执行多个 Order By 的其他方法包括:

var orderByAnonType = db.Select(db.From<Track>().OrderBy(x => new { x.Album, x.Name }));

var orderByString = db.Select(db.From<Track>().OrderByFields("Album","Name"));

// Use `-` prefix to inverse sort order, e.g. Album Descending
var orderByString = db.Select(db.From<Track>().OrderByFields("-Album","Name"));

var orderByArray = db.Select(db.From<Track>().OrderBy(x => new[]{ "Album","Name" }));
Run Code Online (Sandbox Code Playgroud)

所以你可以得到一个灵活的 OrderBy 像AutoQuery 的 OrderBy一样:

var fields = orderByString.Split(',', StringSplitOptions.RemoveEmptyEntries);
q.OrderByFields(fields);
Run Code Online (Sandbox Code Playgroud)

这是你可以在gistlyn.com上玩的一个活生生的例子