【问题标题】:OrmLite doesn't apply soft delete filter on joinsOrmLite 不对连接应用软删除过滤器
【发布时间】:2018-09-06 02:22:23
【问题描述】:

我添加了一个SqlExpressionSelectFilter 以使用ServiceStack OrmLite 中的soft delete 功能。但是,它似乎只将过滤器应用于From<T> 中指定的基表,而不是与Join<TFrom, TOther> 连接的任何表。我的两种类型都实现了我在过滤器中使用的接口。这是受支持的吗?

过滤器:

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
}

POCO:

[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" &lt;&gt; @1),但它只包含在 from 子句中指定的 VendorItem 表的过滤器。

我还觉得奇怪的是,我必须在接口和实现它的类上都指定别名才能使其工作。我仅在界面和 POCO 上尝试过,但在我指定两者之前都没有工作。这是设计的吗?

【问题讨论】:

    标签: c# ormlite-servicestack


    【解决方案1】:

    OrmLite 仅在 from 表上执行 SqlExpressionSelectFilter,当您使用接口查询时,OrmLite 将无法找到具体类型的元数据,这就是为什么需要在接口上指定它的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 2017-05-19
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多