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