ServiceStack ormLite chaning OrderBy

时间:2017-10-31 19:34:20

标签: c# sql-order-by ormlite-servicestack

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

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

以上工作完美。但我想要一个更通用的方法并解析一个字符串,如sort =&#34; field1,field2&#34;。我有以下代码:

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

但上面的代码似乎覆盖了第一个OrderBy。有这样一个问题的解决方案吗?

由于

2 个答案:

答案 0 :(得分:3)

您可以使用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>().OrderBy("Album,Name"));

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

您可以在live example of this

上使用gistlyn.com

答案 1 :(得分:-1)

我想解决的已接受答案中有几个问题。

首先是SQL注入攻击的可能性。 ServiceStack不能完全验证您传递给排序列列表的内容。尽管它可以检测到一些更明显的攻击,但您仍然可以使用诸如调用存储函数之类的方法。

第二个问题是降序排序。从API来看不是很明显,但是您可以传递"columnName DESC"而不是"columnName"。实际上,这就是它支持"Album,Name"的方式,它只是通过最少的验证就直接将其传递给SQL。

public IList<Employee> SortBy(string lastName, string sortByColumnA, bool isDescendingA, string sortByColumnB, bool isDescendingB)
{
    if (!Utilities.EmployeeColumnNames.Contains(sortByColumnA))
        throw new ArgumentOutOfRangeException(nameof(sortByColumnA), "Unknown column " + sortByColumnA);
    if (!Utilities.EmployeeColumnNames.Contains(sortByColumnB))
        throw new ArgumentOutOfRangeException(nameof(sortByColumnB), "Unknown column " + sortByColumnB);

    var sortDirectionA = isDescendingA ? " DESC " : "";
    var sortDirectionB = isDescendingB ? " DESC " : "";

    using (var db = _dbConnectionFactory.OpenDbConnection())
    {
        return db.Select(db.From<Employee>().Where(x => x.LastName == lastName)
            .OrderBy(sortByColumnA + sortDirectionA + "," + sortByColumnB + sortDirectionB)).ToList();
    }
}