【发布时间】:2010-11-23 17:55:38
【问题描述】:
我正在使用 VS2010 .Net4 Linq-to-EntityFramework 并希望显式加载一些子数据。我想提供类似于 DataLoadOptions 或 LoadWith 的功能,这些功能可用于 Linq-to-SQL IIUC,但不适用于 Linq-to-EF。
(顺便说一句,这是为了让我可以记录数据以便稍后在测试期间播放。我们使用了延迟加载,我需要找到这些出现并替换为急切加载。DataLoadOptions 方法将允许一种干净的方式来实现这一点。)
我正在尝试提供一种类型安全的急切加载方案,如MosesOfEgypt blog 所述。我已经修改了 T4 的一代,并且遇到了我认为是最后一个问题。在 .Net4 中,实体属性返回 ObjectSet。但不幸的是,Include 函数返回 ObjectQuery,它是 ObjectSet 的基类。
这是从修改后的 T4 模板生成的 ObjectContext 类的子集:
#region DataLoadOptions Functionality
public DataLoadOptions LoadOptions { get; set; }
private ObjectSet<TEntity> ApplyDataLoadOptions<TEntity>(string queryString) where TEntity : class
{
var query = CreateObjectSet<TEntity>(queryString);
if (LoadOptions != null)
{
var members = LoadOptions.GetPreloadedMembers<TEntity>();
foreach (var member in members)
{
********** query = query.Include(member.Name);
}
}
return query;
}
#endregion
#region ObjectSet Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
public ObjectSet<Address> Addresses
{
get
{
if ((_Addresses == null))
{
_Addresses = ApplyDataLoadOptions<Address>("Addresses");
}
return _Addresses;
}
}
#endregion
以“*”开头的行是从 ObjectQuery 到 ObjectSet 的转换发生的地方。而且这是一个无效的向上转换,因此如果在设计时显式转换,将在运行时失败,除非我做错了。
一种解决方案可能是为 ObjectSet.Include 编写扩展方法,使其返回 ObjectSet 而不是 ObjectQuery。如果可能的话,我想知道如何找到 ObjectQuery.Include 函数的源代码。而且我不确定这些解决方案是否可行。
还想知道是否有办法将 Include 函数的结果从 ObjectQuery 向上转换为 ObjectSet。同样,不确定这是否可行。
任何有关在 .Net4 中为 Linq-to-EF 实现 DataLoadOptions 功能的帮助将不胜感激。
【问题讨论】:
标签: .net linq entity-framework-4 eager-loading