详细说明我尝试使用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中的所有数据。
非常感谢任何帮助!
答案 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));