繁体   English   中英

ServiceStack ORMLite LeftJoin混乱

[英]ServiceStack ORMLite LeftJoin confusion

我有一个简单的Vendor-> Product关系,具有以下设置(忽略了不相关的属性):

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()的问题是我试图使用LoadSelect()使用使用LeftJoin()查询的引用来填充实体。 但是实际上,该LoadSelect()用于标识供应商,然后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在单个步骤中使用供应商和引用/过滤的产品加载实体。 使用ORMLite是否可以使用LeftJoin()仅加载IsDeleted为false的引用产品?

由于您发现对LoadSelect查询仅影响查询的供应商,因此它不用于筛选供应商参考的产品数据,并且目前无法更改加载的参考数据。

因此,可用的解决方案是发出单独的请求并在执行操作时使用POCO合并API ,或者使用LoadSelect但在客户端上删除已删除的产品,例如:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM