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