.Net4 中的预加载链接至 EF;也许像 DataLoadOptions
我正在使用 VS2010 .Net4 Linq-to-EntityFramework 并希望显式急切加载一些子数据。我想提供类似于 DataLoadOptions 或 LoadWith 的功能,这些功能可用于 Linq-to-SQL IIUC,但不可用于 Linq-to-EF。
(顺便说一句,这是为了我可以记录稍后在测试期间回放的数据。我们使用了延迟加载,我需要找到这些事件并替换为急切加载。DataLoadOptions方法将允许一种干净的方式来实现这一点。)
我试图提供一个类型安全的急切加载方案,如 MosesOfEgypt 博客。我修改了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 功能的帮助将不胜感激。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
目前还不清楚你在这里问什么。
.Include
返回一个ObjectQuery
,它实现IQueryable
。为什么要将其转换为ObjectSet
?WRT“强类型”
包含
,简短的答案是你不能。但是你可以通过扩展方法的语法糖让它变得更甜。我们为每个实体创建枚举(可能有点过头了,但我讨厌魔术字符串),其中包含每个关联。我们的存储库接受这些枚举的数组。然后,我们在枚举上使用扩展方法来转换为
Include
。示例(简化)存储库代码:
扩展:
.ToNavigationalProperty()
是枚举上的另一个扩展方法,它仅返回匹配的导航属性。It's not really clear what your asking here.
.Include
returns anObjectQuery<T>
, which implementsIQueryable<T>
. Why do you want to cast it asObjectSet<T>
??WRT "strongly-typed"
Include
's, the short answer is you can't. But you can make it sweeter with the syntactic sugary of extension methods.We create enumerations for each entity (may be overkill, but i hate magic strings), which contain each association. Our Repository accepts an array of these enumerations. We then use an extension method on the enumeration to convert to an
Include
.Example (simplified) Repository code:
And the extension:
.ToNavigationalProperty()
is another extension method on the enumeration, which simply returns the matching Navigational property.不确定这是否回答了您的问题...但是,这是我如何完成“动态”急切加载的:
希望这会有所帮助。
Not sure if this answers your question... however, here is how I have done "dynamic" eager loading:
Hope this helps.