我的问题可能非常简单,如何加载子类。我找不到任何"load"或类似的东西来让上下文加载子类。
上下文类是ObjectContext类型,如下所示:
public partial class RTIPricingEntities : global::System.Data.Objects.ObjectContext
产品
Product.ModifiedByUser(如何在加载产品时加载此类?)
Product.Category(如何在加载产品时加载类别?)
我的问题可能非常简单,如何加载子类。我找不到任何"load"或类似的东西来让上下文加载子类。
上下文类是ObjectContext类型,如下所示:
public partial class RTIPricingEntities : global::System.Data.Objects.ObjectContext
产品
Product.ModifiedByUser(如何在加载产品时加载此类?)
Product.Category(如何在加载产品时加载类别?)
你可以使用急切加载:
var q = from p in Context.Products
.Include("ModifiedByUser")
.Include("Category")
select p;
...或项目:
var q = from p in Context.Products
select new
{
Id = p.Id,
Name = p.Name
ModifiedByUserName = p.ModifiedByUser.Name,
CategoryName = p.Category.Name
}
投影的优点在于您只获取所需数据,而不是每个引用实体的整个内容。急切加载的优点在于返回的实体具有更改跟踪。根据手头问题选择正确的技术。
更新
是的,提到您正在使用RIA服务很重要。我假设您也在客户端工作。这使事情完全不同。
在RIA服务中,非常重要的是确保在初始加载时返回您需要的整个实体关系图。您不想在实体上调用类似.Load()的任何方法,因为这将是对服务器的另一个热点访问,这对性能来说是不好的。如果您在例如Silverlight客户端中请求服务器上的实例列表,并且其相关属性尚未被材料化,那么现在已经太迟了。此外,在Silverlight客户端中不起作用。因此,RIA服务有可用于确保最初返回正确的、完全材料化对象图的服务器端工具。
您需要做的是在RIA服务服务器中使用IncludeAttribute。您可以创建一个“伙伴”元数据类来装饰您的实体模型,其中包含[Include]。在RIA服务概述文档第4.8节中有示例。.Include()
是实现所需功能的好方法。if(!Product.CategoryReference.IsLoaded)
{
Product.CategoryReference.Load();
}
if(!Product.Parts.IsLoaded)
{
Product.Parts.Load();
}
例如,要加载 ModifiedByUser 和 Category,您可以使用以下查询:
var q = from p in context.Products.Include("ModifiedByUser").Include("Category")
select p;
如果您的Category实体还有一个ModifiedByUser实体需要加载,您可以使用以下查询语句:
var q = from p in context.Products
.Include("ModifiedByUser")
.Include("Category.ModifiedByUser")
select p;
请参考MSDN上的调整查询结果,了解更多示例。
我注意到Craig提出的解决方案没有同时加载ModifiedByUser和Category。它只加载了最后一个对象集合,即“Category”。
var q = from p in Context.Products
.Include("ModifiedByUser")
.Include("Category")
select p;
.Include("Category").Include("ModifiedByUser")
,那么就会加载ModifiedByUser
。奇怪的是,这两个对象集合的IsLoaded
属性都会显示“true”,但是第一个对象集合的计数始终为零。不确定为什么会这样。