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" }));
因此您可以获得像 AutoQuery's OrderBy 这样灵活的 OrderBy:
var fields = orderByString.Split(',', StringSplitOptions.RemoveEmptyEntries);
q.OrderByFields(fields);
这是一个live example of this you can play around with on gistlyn.com
我想解决的已接受答案中有几个问题。
首先是 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();
}
}
我正在尝试执行以下操作:
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" }));
因此您可以获得像 AutoQuery's OrderBy 这样灵活的 OrderBy:
var fields = orderByString.Split(',', StringSplitOptions.RemoveEmptyEntries);
q.OrderByFields(fields);
这是一个live example of this you can play around with on gistlyn.com
我想解决的已接受答案中有几个问题。
首先是 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();
}
}