在ServiceStack实体中注入或绑定“别名”

时间:2014-07-24 08:16:34

标签: ormlite-servicestack

我有3个包含相同列的表。我是否需要为所有数据库表创建3个实体?有没有办法避免创建3个实体并且只有一个在ServiceStack中?

是的,有一种方法可以像下面这样做

List<EntityA> list = db.SqlList<EntityA>("SELECT COL_A,COL_B FROM TableA");

实体在课堂上没有 别名

public class EntityA
{
    [Alias("COL_A")]
    public string ColumnA { get; set; }
    [Alias("COL_B")]
    public string ColumnB { get; set; }
}

通过这种方式我可以更改查询中提供的表名( TableA / TableB / TableC ) 但我希望在从数据库中检索结果时注入/传递别名。我不确定服务栈

是否可行

被修改 让我重新解释这个问题而不是像EntityTableA / EntityTableB / EntityTableC那样返回差异对象作为我想要的结果

return db.Select<GenericEntity>(w => w.OrderBy(o => o.ColumnA));

GenericEntity 可以是任何表格结果

1 个答案:

答案 0 :(得分:0)

您可以使用继承来减少样板:

public class EntityBase
{
    [Alias("COL_A")]
    public string ColumnA { get; set; }
    [Alias("COL_B")]
    public string ColumnB { get; set; }
}

然后从共享实体继承属性,例如:

public class TableA : EntityBase {}
public class TableB : EntityBase {}

然后正常查询:

var results = db.Select<TableA>(q => ColumnA == "A");

否则,使用任何原始SQL API都会起作用。

修改SqlExpression

您还可以覆盖SqlExpression FromExpression以包含您自己的表,例如:

var q = db.From<GenericEntity>().OrderBy(o => o.ColumnA);
q.From("TableA");
List<GenericEntity> results = db.Select(q);

这会将SQL改为TableA的SELECT。