ServiceStack ORMLite LeftJoin混乱

时间:2017-08-08 04:55:02

标签: c# servicestack ormlite-servicestack

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

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在一个步骤中使用Vendor和引用/过滤的产品加载实体。使用ORMLite是否可以使用LeftJoin()仅加载IsDeleted为假的引用产品?

1 个答案:

答案 0 :(得分:2)

由于您发现LoadSelect上的查询仅影响所查询的供应商,因此不会用于过滤供应商引用的产品数据,并且目前无法更改其加载的引用数据。

因此,可用的解决方案是制作单独的请求并使用POCO merge API,或者使用LoadSelect,但在客户端删除已删除的产品,例如:

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