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