我有一个简单的供应商 - >与以下设置的产品关系(省略了非相关属性):
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在一个步骤中使用Vendor和引用/过滤的产品加载实体。使用ORMLite是否可以使用LeftJoin()
仅加载IsDeleted
为假的引用产品?
答案 0 :(得分:2)
由于您发现LoadSelect
上的查询仅影响所查询的供应商,因此不会用于过滤供应商引用的产品数据,并且目前无法更改其加载的引用数据。
因此,可用的解决方案是制作单独的请求并使用POCO merge API,或者使用LoadSelect
,但在客户端删除已删除的产品,例如:
var vendors = db.LoadSelect<Vendor>(x => !x.IsDeleted);
vendors.Products.RemoveAll(x => x.IsDeleted);