2017-08-08 96 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

這是好消息謝謝你 - 由於每個供應商的產品數量很少,因此在客戶端上刪除可能是性能最高的,並可節省網絡請求。 –