teleerik Open Access FetchStrategy似乎并不适用于我的查询
本文关键字:不适用 适用于 我的 查询 Open Access FetchStrategy teleerik | 更新日期: 2023-09-27 18:09:28
我的Telerik OpenAccess ORM有一些(更多)问题。这一次是在将Fetch策略应用于查询的领域。下面是代码…
using (DAL.DarkRoomDB ctx = new DarkRoomDB())
{
//
// Set the resulting object to include the contents of the package
FetchStrategy strategy = new FetchStrategy();
strategy.LoadWith<DeliverablePackageEntity>(c => c.PackageContents);
strategy.LoadWith<DeliverablePackageContentEntity>(c => c.Deliverable);
strategy.LoadWith<DeliverablePackageContentEntity>(c => c.DeliverablePackage);
strategy.MaxFetchDepth = 3;
ctx.FetchStrategy = strategy;
//
// get the package that matches the SKU
DataStoreRepository<DeliverablePackageEntity> repo = DataStoreRepository<DeliverablePackageEntity>.GetInstance(ctx);
DeliverablePackageEntity entity = repo.GetEntityList(c => c.PackageSku == SKU).FirstOrDefault();
//
// Create a DISCONNECTED COPY of the entity
copy = ctx.CreateDetachedCopy<DeliverablePackageEntity>(entity, strategy);
}
ret = EntityToDomainMapper.Map<DeliverablePackageEntity, DeliverablePackage>(copy);
return ret;
当我运行这个时,我希望的DeliverablePackageEntity的PackageContents被预加载。当我在调试器中查看实体变量时,它告诉我"在扩展时将枚举属性的内容",这表明该属性尚未预填充,这就是我认为FetchStrategy的目的。
我错过了什么吗?
这个行为是正常的,因为实体对象的导航属性是IEnumerable类型。因此,即使它们在内存中预加载,您也需要通过枚举来访问它们。
您可以通过检查访问时是否生成SQL脚本来验证FetchStrategy中指定的导航属性是否已预加载。
考虑以下示例,其中Car对象的相关RentalOrders是预加载的。在执行ToList()方法时,它们将被枚举,但executedScript将保持空,因为它们已被FetchStrategy预加载:
using (EntitiesModel1 context = new EntitiesModel1())
{
FetchStrategy loadWithRentalOrders = new FetchStrategy();
loadWithRentalOrders.LoadWith<Car>(car => car.RentalOrders);
context.FetchStrategy = loadWithRentalOrders;
Car firstCar = context.Cars.First();
context.Log = new StringWriter();
List<RentalOrder> relatedOrders = firstCar.RentalOrders.ToList();
//should be empty
string executedScript = context.Log.ToString();
}