Search code examples
c#sql-order-byormlite-servicestack

ServiceStack ormLite chaning OrderBy


I am trying to so the following:

var routines = con.Select<Table>(con.From<Table>().OrderBy(p => p.Field1).ThenBy(i => i.Field2));

The above works perfectly. But I want a rather more generic approach and parse a string like sort="field1,field2". I have the following code:

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++;
}

But the above code seems to overwrite the first OrderBy. Is there a solution to such a problem?

Thanks


Solution

  • Other ways you can perform multiple Order By's with ServiceStack.OrmLite include:

    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" }));
    

    So you could get a flexible OrderBy like AutoQuery's OrderBy with:

    var fields = orderByString.Split(',', StringSplitOptions.RemoveEmptyEntries);
    q.OrderByFields(fields);
    

    Here's a live example of this you can play around with on gistlyn.com