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

时间:2019-07-19 19:52:15

标签: c# servicestack ormlite-servicestack

详细说明我尝试使用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过滤,而不是由repo编码?我有一个抽象存储库,所有存储库都来自该存储库。而且一些存储库需要读取不同store_id中的所有数据。

enter image description here

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

这个问题尚不清楚它想要什么答案,该屏幕截图表示它不知道该使用哪个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));