ServiceStack ORMLite LeftJoin 混乱

ServiceStack ORMLite LeftJoin confusion

我有一个简单的供应商 -> 产品关系,具有以下设置(省略了不相关的属性):

public class Vendor
{
    public Guid Id { get; set; }
    public bool IsDeleted { get; set; }

    [Reference]
    public List<Product> Products {get; set; }
}

public class Product
{
    public Guid Id { get; set; }
    public bool IsDeleted { get ; set; }

    [ForeignKey(typeof(Vendor))]
    public Guid VendorId {get; set; }
}

我在这种情况下使用了软删除,并尝试使用 LeftJoin() 来检索具有引用和未删除产品列表的供应商。我的第一次尝试没有成功,我认为左连接的问题是我试图使用 LoadSelect() 来使用 LeftJoin() 查询的引用填充实体。但实际上连接被用来识别供应商,然后 LoadSelect() 为该供应商填充产品。经过多次测试和谷歌搜索后,我得到了以下有效的代码,但它是一个两步过程。

public async Task<Vendor> GetVendorProductsAsync(Guid vendorId)
{
    using (var con = DbFactory.Open())
    {
        try
        {
            var vendor = (await con.SelectAsync<Vendor>(v => v.Id == vendorId && !v.IsDeleted)).SingleOrDefault();
            if (vendor != null)
            {
                var products = await con.SelectAsync<Product>(p => p.VendorId == vendorId && !p.IsDeleted);
                vendor.Merge(products);
            }
            return vendor;
        }
        catch (Exception ex)
        {
            Log.Error(ex, "{@LastSql}", con.GetLastSql());
            throw;
        }
    }
}

我更愿意使用数据库执行连接,然后 ORMLite 一步加载实体与供应商和 referenced/filtered 产品。使用 ORMLite 是否可以使用 LeftJoin() 仅加载 IsDeleted 为假的引用产品?

正如您所发现的,在 LoadSelect 上的查询只会影响所查询的供应商,它不会用于过滤供应商引用的产品数据,并且目前无法更改它加载的引用数据。

所以可用的解决方案是发出单独的请求并使用 POCO merge API 或使用 LoadSelect 但之后删除客户端上已删除的产品,例如:

var vendors = db.LoadSelect<Vendor>(x => !x.IsDeleted); 
vendors.Products.RemoveAll(x => x.IsDeleted);