Telerik Open Access FetchStrategy 似乎并未应用于我的查询
Telerik Open Access FetchStrategy does not seem to be applied to my query
我的 Telerik OpenAccess ORM 有一些(更多)问题。这次是将 Fetch Strategies 应用于查询。这是代码...
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。当我在调试器中查看 entity 变量时,它告诉我 "contents of the property will be enumerated when expanded" 向我暗示 属性 尚未预填充,这就是我认为 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();
}
希望对您有所帮助。
我的 Telerik OpenAccess ORM 有一些(更多)问题。这次是将 Fetch Strategies 应用于查询。这是代码...
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。当我在调试器中查看 entity 变量时,它告诉我 "contents of the property will be enumerated when expanded" 向我暗示 属性 尚未预填充,这就是我认为 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();
}
希望对您有所帮助。