这是我尝试过的一些事情...希望您可以从中推断出我正在尝试做什么以及我做错了什么。好的,我在使用此 DoQuery 时遇到加载相关实体的问题:
public ObjectQuery<E> DoQuery(ISpecification<E> where)
{
return (ObjectQuery<E>)_ctx.CreateQuery<E>("[" + typeof(E).Name + "]").Where(where.EvalPredicate);
}
如果我只使用它,我最终会得到一个对象,其中包含除相关实体之外的所有正确参数……即。如果一个是引用到 User 表的 UserID,我也不会取回 User 对象。
我读到你可以做一个 .Include("User") 来做实体的预加载......但是当我尝试这个时它不起作用:
public ObjectQuery<E> DoQuery(ISpecification<E> where)
{
return (ObjectQuery<E>)_ctx.CreateQuery<E>("[" + typeof(E).Name + "]").Include("User").Where(where.EvalPredicate);
}
我还检查以确保实体集名称和模型名称是“用户”,它们确实是。我唯一能想到的另一件事是将多个内容放入 ("["+ typeof(E).Name + "]")
但我不确定如何在其中包含多个实体那里......这是我尝试过的,因为我看到有人说你可以通过将 .中间。
public ObjectQuery<E> DoQuery(ISpecification<E> where)
{
return (ObjectQuery<E>)_ctx.CreateQuery<E>("[" + typeof(E).Name + "].[User]").Where(where.EvalPredicate);
}
但是那没有用...
如果我不在正确的轨道上,请告诉我。有谁知道在使用 ObjectContext.CreateQuery 时如何加载相关实体?任何建议或见解都有帮助。
谢谢,
马特
最佳答案
CreateQuery 采用 ESQL 语句。所以你可以这样写:
public ObjectQuery<E> DoQuery(ISpecification<E> where)
{
var esql = String.Concat(
"SELECT VALUE e1 FROM OFTYPE(",
GetEntitySetName(typeof(E)),
", ",
typeof(T).FullName,
") AS e1");
return Context.CreateQuery<T>(esql).Include("User").Where(where.EvalPredicate);
}
...其中 GetEntitySetName 是您编写的方法,它返回实体类型的字符串实体集名称,或使用 eager loading strategy .
为什么选择 OFTYPE?如果您的模型中有继承,此 ESQL 将返回 ObjectQuery<TParent>
而不是 ObjectQuery<TChild>
没有它。
最后,Include
仅当实体 E 具有名为 User 的 property 时才有效。类型和实体集名称与 Include
无关.
关于c# - 使用 ObjectContext.CreateQuery( Entity Framework 和存储库)加载相关实体(预加载)时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1655360/