使用 Servicestack.Ormlite 使用拦截过滤器实现所有读取 api

Implementing all read api with a intercepting filter using Servicestack.Ormlite

详细说明我试图用 servicestack.ormlite 实现的目标。想象一下,一家特许经营企业有一些分支机构,每个分支机构都有系统和本地数据库,所有这些数据库都在相互复制。在系统中,每个模型都有一个名为 store_id 的 属性,如下所示。

public class UserEntity : EntityBase
{
    [PrimaryKey, AutoIncrement]
    public int id { get; set; }
    public string user_id { get; set; }
    public string name { get; set; }
    public string email { get; set; }
    public string password { get; set; }
    public int role { get; set; }
}
public class EntityBase
{
    public int store_id {get;set;}
    public bool is_delete {get;set;}
}

我们有 40 多个实体和回购协议,有没有什么办法可以让所有 servicestack.ormlite 读取 api 在一次操作中被 store_id 过滤,而不是通过回购编码回购协议?我有一个抽象的 repobase,所有 repos 都是从中派生的。并且一些 repos 需要读取不同 store_id.

中的所有数据

非常感谢任何帮助!!

这个问题仍然不清楚它想要什么答案,屏幕截图说它不知道使用哪个 API 来过滤 store_id 但你的屏幕截图包含 2 个不同的过滤示例store_id?

db.Where<T>(new { store_id = _store_id });

db.Where<T>("store_id", _store_id); 

两者都应该有效。尽管我建议尽可能使用 Typed 版本,但您也可以使用 nameof() 而不是魔术字符串:

db.Where<T>(nameof(EntityBase.store_id), _store_id); 

也许您正在寻找在通用存储库中执行相同操作的不同示例?

您也可以使用键入的 SqlExpression<T>:

进行查询
var q = db.From<T>().Where(x => (x as EntityBase).store_id == _store_id);
var all = db.Select(q);

或者,如果您想将其与其他类型化的表达式结合使用:

var q = db.From<T>().Where(x => (x as EntityBase).store_id == _store_id);
var filtered = db.Select(q.And(expr));

由于您已经在使用通用约束,因此您还可以添加实体也必须是 EntityBase 的约束,例如:

class RepoBase<T> where T : EntityBase, new() { ... }

这样你就可以在不转换的情况下进行查询,例如:

var q = db.From<T>().Where(x => x.store_id == _store_id);
var all = db.Select(q);

var q = db.From<T>().Where(x => x.store_id == _store_id);
var filtered = db.Select(q.And(expr));