使用 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));
详细说明我试图用 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));