繁体   English   中英

ServiceStack ormLite 更改 OrderBy

[英]ServiceStack ormLite chaning OrderBy

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

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

以上工作完美。 但我想要一种更通用的方法并解析像 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++;
}

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

谢谢

您可以使用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" }));

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

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

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

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

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

第二个问题是降序排序。 从 API "columnName DESC"并不明显,但您可以传入"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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM