[英]ServiceStack ORMLite LeftJoin confusion
我有一个简单的Vendor-> Product关系,具有以下设置(忽略了不相关的属性):
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()
的问题是我试图使用LoadSelect()
使用使用LeftJoin()
查询的引用来填充实体。 但是实际上,该LoadSelect()
用于标识供应商,然后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
为false的引用产品?
由于您发现对LoadSelect
查询仅影响查询的供应商,因此它不用于筛选供应商参考的产品数据,并且目前无法更改加载的参考数据。
因此,可用的解决方案是发出单独的请求并在执行操作时使用POCO合并API ,或者使用LoadSelect
但在客户端上删除已删除的产品,例如:
var vendors = db.LoadSelect<Vendor>(x => !x.IsDeleted);
vendors.Products.RemoveAll(x => x.IsDeleted);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.