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