c# - 使用 ObjectContext.CreateQuery( Entity Framework 和存储库)加载相关实体(预加载)时遇到问题

标签 c# asp.net-mvc entity-framework linq-to-entities eager-loading

这是我尝试过的一些事情...希望您可以从中推断出我正在尝试做什么以及我做错了什么。好的,我在使用此 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/

相关文章:

c# - RedirectToRoute 在参数中对 "/"进行双重编码,这些参数是 routeValues 中的 URL

jquery - MVC3 : jquery ajax to return partial view with HTML dataType from controller but getting error

c# - Linq 交叉表和分组

mysql - 身份验证/授权 Entity Framework

c# - 当另一个属性更改时更新实体属性(实体初始化后)

c# - 如何在 Windows 任务栏中对不同的应用程序进行分组?

c# - 计算具有字符串属性的类的哈希码的最佳方法是什么?

c# - 翻转顶点数组

c# - 如何在 MVC 4 中用图像保存模型

c# - ASP.NET MVC 5 和 Visual Studio 2015RC CS0234 和 CS0103 错误