OrmLite 不对连接应用软删除过滤器
OrmLite doesn't apply soft delete filter on joins
我添加了 SqlExpressionSelectFilter
以使用 ServiceStack OrmLite 中的 soft delete 功能。但是,它似乎只将过滤器应用于 From<T>
中指定的基础 table,而不是任何与 Join<TFrom, TOther>
连接的 table。我的两种类型都实现了我在过滤器中使用的接口。这是受支持的东西吗?
过滤器:
OrmLiteConfig.SqlExpressionSelectFilter = query =>
{
if (query.ModelDef.ModelType.HasInterface(typeof(IHasRecordStatus)))
{
query.Where<IHasRecordStatus>(q => q.RecordStatus != RecordStatus.Deleted);
}
};
接口:
public interface IHasRecordStatus
{
[Alias("RECORD_STATUS")]
RecordStatus RecordStatus { get; set; }
}
[EnumAsInt]
public enum RecordStatus : byte
{
Added = 1,
Changed = 2,
Deleted = 3
}
POCOs:
[Alias("ITEM_MASTER")]
public class ItemMaster : IHasRecordStatus
{
[PrimaryKey]
[Alias("ITEM_ID")]
public int Id { get; set; }
[Alias("UPC_EAN")]
public string Upc { get; set; }
[Alias("RECORD_STATUS")]
public RecordStatus RecordStatus { get; set; }
}
[Alias("VENDOR_ITEM")]
public class VendorItem : IHasRecordStatus
{
[Alias("VI_ID")]
public int Id { get; set; }
[Alias("ITEM_ID")]
public int ItemId { get; set; }
[Alias("V_ID")]
public int VendorId { get; set; }
[Alias("RECORD_STATUS")]
public RecordStatus RecordStatus { get; set; }
}
查询:
var query = db.From<VendorItem>()
.Join<VendorItem, ItemMaster>((vi, im) => vi.ItemId == im.Id)
.Take(2);
var result = db.Select(query);
输出SQL:
SELECT TOP 2 "VENDOR_ITEM"."VI_ID" AS "Id", "VENDOR_ITEM"."ITEM_ID" AS "ItemId", "VENDOR_ITEM"."V_ID" AS "VendorId", "VENDOR_ITEM"."RECORD_STATUS" AS "RecordStatus"
FROM "VENDOR_ITEM" INNER JOIN "ITEM_MASTER" ON ("VENDOR_ITEM"."ITEM_ID" = "ITEM_MASTER"."ITEM_ID")
WHERE ("VENDOR_ITEM"."RECORD_STATUS" <> @0)
在生成的 SQL 中,我希望 where 子句也包含 (AND "ITEM_MASTER"."RECORD_STATUS" <> @1)
,但它只包含在 from 中指定的 VendorItem table 的过滤器条款。
我还发现奇怪的是,我必须在接口和实现它的 类 上指定别名才能工作。我只在界面上和 POCO 上尝试过,但在我指定两者之前都没有用。这是设计使然吗?
OrmLite 仅在 table 上执行 SqlExpressionSelectFilter
,当您使用接口查询时,OrmLite 将无法找到具体类型的元数据,这就是需要指定它的原因在界面上。
我添加了 SqlExpressionSelectFilter
以使用 ServiceStack OrmLite 中的 soft delete 功能。但是,它似乎只将过滤器应用于 From<T>
中指定的基础 table,而不是任何与 Join<TFrom, TOther>
连接的 table。我的两种类型都实现了我在过滤器中使用的接口。这是受支持的东西吗?
过滤器:
OrmLiteConfig.SqlExpressionSelectFilter = query =>
{
if (query.ModelDef.ModelType.HasInterface(typeof(IHasRecordStatus)))
{
query.Where<IHasRecordStatus>(q => q.RecordStatus != RecordStatus.Deleted);
}
};
接口:
public interface IHasRecordStatus
{
[Alias("RECORD_STATUS")]
RecordStatus RecordStatus { get; set; }
}
[EnumAsInt]
public enum RecordStatus : byte
{
Added = 1,
Changed = 2,
Deleted = 3
}
POCOs:
[Alias("ITEM_MASTER")]
public class ItemMaster : IHasRecordStatus
{
[PrimaryKey]
[Alias("ITEM_ID")]
public int Id { get; set; }
[Alias("UPC_EAN")]
public string Upc { get; set; }
[Alias("RECORD_STATUS")]
public RecordStatus RecordStatus { get; set; }
}
[Alias("VENDOR_ITEM")]
public class VendorItem : IHasRecordStatus
{
[Alias("VI_ID")]
public int Id { get; set; }
[Alias("ITEM_ID")]
public int ItemId { get; set; }
[Alias("V_ID")]
public int VendorId { get; set; }
[Alias("RECORD_STATUS")]
public RecordStatus RecordStatus { get; set; }
}
查询:
var query = db.From<VendorItem>()
.Join<VendorItem, ItemMaster>((vi, im) => vi.ItemId == im.Id)
.Take(2);
var result = db.Select(query);
输出SQL:
SELECT TOP 2 "VENDOR_ITEM"."VI_ID" AS "Id", "VENDOR_ITEM"."ITEM_ID" AS "ItemId", "VENDOR_ITEM"."V_ID" AS "VendorId", "VENDOR_ITEM"."RECORD_STATUS" AS "RecordStatus"
FROM "VENDOR_ITEM" INNER JOIN "ITEM_MASTER" ON ("VENDOR_ITEM"."ITEM_ID" = "ITEM_MASTER"."ITEM_ID")
WHERE ("VENDOR_ITEM"."RECORD_STATUS" <> @0)
在生成的 SQL 中,我希望 where 子句也包含 (AND "ITEM_MASTER"."RECORD_STATUS" <> @1)
,但它只包含在 from 中指定的 VendorItem table 的过滤器条款。
我还发现奇怪的是,我必须在接口和实现它的 类 上指定别名才能工作。我只在界面上和 POCO 上尝试过,但在我指定两者之前都没有用。这是设计使然吗?
OrmLite 仅在 table 上执行 SqlExpressionSelectFilter
,当您使用接口查询时,OrmLite 将无法找到具体类型的元数据,这就是需要指定它的原因在界面上。