2017-08-08 222 views
1

我有一个简单的供应商 - >使用以下设置产品的关系(非相关性的消隐):ServiceStack ORMLite LeftJoin混乱

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

回答

2

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

所以可用的解决方案是使单独的请求,并使用POCO merge API为你做什么或使用LoadSelect但之后删除客户端上删除的产品,如:

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

这是好消息谢谢你 - 由于每个供应商的产品数量很少,因此在客户端上删除可能是性能最高的,并可节省网络请求。 –