ServiceStack AutoQuery 获取随机行
ServiceStack AutoQuery get random rows
我正在从 EF6 迁移并尝试使用 ServiceStack AutoQuery,但我遇到了一个问题 - 无法找到从数据库中获取随机行的方法。
还有一种方法可以直接在 ORMLite POCO 中创建计算列,这样我就可以操作一些数据,例如从 FIRST NAME 和 LAST NAME 创建 FULL NAME。
此致
将额外的“计算”信息添加到您的服务而不将它们添加到数据库 Table 的非侵入性最小的方法是创建 getter 属性 用 [Ignore]
注释,OrmLite 将忽略它,但在从服务 returned 时仍然序列化,例如:
public class Contact
{
[AutoIncrement]
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[Ignore]
public string FullName => FirstName + " " + LastName;
}
[Route("/contacts")]
public class QueryContacts : QueryDb<Contact> {}
在 OrmLite 查询中 returning “计算”数据的替代方法是使用 OrmLite 的 [CustomSelect] attribute 让 OrmLite return 计算 SQL 表达式而不是列,例如:
public class Contact
{
[AutoIncrement]
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[CustomSelect("FirstName || ' ' || LastName")]
public string FullName { get; set; }
}
从 v5.9.1 现在 available on MyGet 您可以按“随机”排序以按随机行排序,例如:
/contacts?OrderBy=Random
它将通过选定的 RDBMS RANDOM()
函数以随机顺序对 return 行进行排序。
ServiceStack 的早期版本也可以使用 [CustomSelect]
通过 return 使用 RDBMS RANDOM() 函数(通常是 RAND() 或 RANDOM())的列来实现它,例如:
public class Contact
{
[AutoIncrement]
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[CustomSelect("FirstName || ' ' || LastName")]
public string FullName { get; set; }
[IgnoreDataMember]
[CustomSelect("RAND()")]
public int Random { get; set; }
}
哪里可以 order it like any other column,例如:
/contacts?OrderBy=Random
[IgnoreDataMember]
属性将忽略文本序列化程序中的 属性 并阻止它被序列化。
或者您可以让服务总是 return 以随机顺序查询(除非指定了特定的顺序)Custom AutoQuery implementation,例如:
public class MyServices : Service
{
public IAutoQueryDb AutoQuery { get; set; }
public async Task<object> Any(QueryContacts query)
{
using var db = AutoQuery.GetDb(query, base.Request);
var q = AutoQuery.CreateQuery(query, base.Request, db);
if (query.OrderBy == null)
q.OrderByRandom();
return await AutoQuery.ExecuteAsync(query, q, base.Request, db);
}
}
我正在从 EF6 迁移并尝试使用 ServiceStack AutoQuery,但我遇到了一个问题 - 无法找到从数据库中获取随机行的方法。
还有一种方法可以直接在 ORMLite POCO 中创建计算列,这样我就可以操作一些数据,例如从 FIRST NAME 和 LAST NAME 创建 FULL NAME。
此致
将额外的“计算”信息添加到您的服务而不将它们添加到数据库 Table 的非侵入性最小的方法是创建 getter 属性 用 [Ignore]
注释,OrmLite 将忽略它,但在从服务 returned 时仍然序列化,例如:
public class Contact
{
[AutoIncrement]
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[Ignore]
public string FullName => FirstName + " " + LastName;
}
[Route("/contacts")]
public class QueryContacts : QueryDb<Contact> {}
在 OrmLite 查询中 returning “计算”数据的替代方法是使用 OrmLite 的 [CustomSelect] attribute 让 OrmLite return 计算 SQL 表达式而不是列,例如:
public class Contact
{
[AutoIncrement]
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[CustomSelect("FirstName || ' ' || LastName")]
public string FullName { get; set; }
}
从 v5.9.1 现在 available on MyGet 您可以按“随机”排序以按随机行排序,例如:
/contacts?OrderBy=Random
它将通过选定的 RDBMS RANDOM()
函数以随机顺序对 return 行进行排序。
ServiceStack 的早期版本也可以使用 [CustomSelect]
通过 return 使用 RDBMS RANDOM() 函数(通常是 RAND() 或 RANDOM())的列来实现它,例如:
public class Contact
{
[AutoIncrement]
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[CustomSelect("FirstName || ' ' || LastName")]
public string FullName { get; set; }
[IgnoreDataMember]
[CustomSelect("RAND()")]
public int Random { get; set; }
}
哪里可以 order it like any other column,例如:
/contacts?OrderBy=Random
[IgnoreDataMember]
属性将忽略文本序列化程序中的 属性 并阻止它被序列化。
或者您可以让服务总是 return 以随机顺序查询(除非指定了特定的顺序)Custom AutoQuery implementation,例如:
public class MyServices : Service
{
public IAutoQueryDb AutoQuery { get; set; }
public async Task<object> Any(QueryContacts query)
{
using var db = AutoQuery.GetDb(query, base.Request);
var q = AutoQuery.CreateQuery(query, base.Request, db);
if (query.OrderBy == null)
q.OrderByRandom();
return await AutoQuery.ExecuteAsync(query, q, base.Request, db);
}
}