gpt4 book ai didi

.net - .Net4链接到EF的较早加载;也许像DataLoadOptions

转载 作者:行者123 更新时间:2023-12-02 04:12:45 24 4
gpt4 key购买 nike

我正在使用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编写扩展方法。包括,以便它返回 ObjectSet 而不是 ObjectQuery 。我想知道如何查找 ObjectQuery的源代码。如果可能的话,请包括函数。而且我不确定这些解决方案是否有效。

还想知道是否有一种方法可以将 Include 函数的结果从 ObjectQuery 转换为 ObjectSet 。同样,不确定这是否行得通。

在.Net4中为Linq-to-EF实现DataLoadOptions功能的任何帮助将不胜感激。

最佳答案

您在这里问什么还不清楚。
.Include返回实现ObjectQuery<T>IQueryable<T>。为什么要将其转换为ObjectSet<T>

WRT是“强类型” Include,简短的答案是您不能。但是您可以通过扩展方法的语法加甜功能使其更甜。

我们为包含每个关联的每个实体创建枚举(可能是过大了,但我讨厌魔术字符串)。我们的存储库接受这些枚举的数组。然后,我们对枚举使用扩展方法将其转换为Include

示例(简化)存储库代码:

public ICollection<Order> GetOrdersWithUser(Expression<Func<Order,bool>> predicate, OrderAssocations[] includes)
{
return _ctx.Orders.WithAssociations(includes).Where(predicate).ToList();
}

和扩展名:
public static ObjectQuery<Order> WithAssociations(this ObjectQuery<Order> source, OrderAssociations[] includes)
{
var query = source;

foreach (var include in includes)
{
query = query.Include(include.ToNavigationalProperty()));
}

return query;
}
.ToNavigationalProperty()是枚举的另一种扩展方法,它仅返回匹配的Navigational属性。

关于.net - .Net4链接到EF的较早加载;也许像DataLoadOptions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4259177/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com