当我不知道要加载的属性的名称时,如何进行急切加载?

时间:2009-12-23 02:14:26

标签: asp.net-mvc entity-framework repository lazy-loading eager-loading

我有一个通用的存储库,当我使用DoQuery方法从数据库中选择对象时,我需要加载一些相关的实体,以便不在外键字段的位置获取空值。

问题是存储库是通用的,所以我不知道需要加载多少属性或者它们的名称是什么(除非有某种方法可以获取它们)如何才能使它成为所有外键都有它们的在保持此存储库通用的同时加载的实体?

这是DoQuery方法:

    public ObjectQuery<E> DoQuery(ISpecification<E> where)
    {
        ObjectQuery<E> query = (ObjectQuery<E>)_ctx.CreateQuery<E>("[" + typeof(E).Name + "]").Where(where.EvalPredicate);
        return query;
    }

link to the original code for the entire repository.

我之前发过一次并且从来没有得到答案,但我认为这个更有意义,因为在人们假设我知道属性名称之前可以这样做:

.Include("PropertyNameIKnowNeedsToBeLoaded")

这里有question I posted before希望能提供一些关于我在这方面的信息。

感谢任何帮助。

谢谢,
马特

3 个答案:

答案 0 :(得分:0)

您必须通过将应该获取的深度传递给方法来反转控件。我对Entity框架并不熟悉,具体如何做到这一点。您可以传入一个表示获取深度的整数,该方法可以弄清楚如何使用相关实体构建一个查询到该深度。

答案 1 :(得分:0)

您可以获取类型的关系结束名称,并为所有关系调用Include。

    public ObjectQuery<E> DoQuery<E>(ISpecification<E> where) where E : new()
    {
        ObjectQuery<E> query = (ObjectQuery<E>)_ctx.CreateQuery<E>("[" + typeof(E).Name + "]").Where(where.EvalPredicate);

        IEntityWithRelationships entityWithRelationship = (IEntityWithRelationships)(new E());
        IEnumerable<IRelatedEnd> relatedEnds = entityWithRelationship.RelationshipManager.GetAllRelatedEnds();
        foreach (IRelatedEnd end in relatedEnds)
        {
            query= query.Include(end.TargetRoleName);
        }

        return query;
    }

我添加了一个“新的”通用约束,因为我需要从查询类型中获取IEntityWithRelationships。我希望这会有所帮助。

答案 2 :(得分:0)

我已经通过下一个方式解决了这个问题:

 public IQueryable<E> GetAll()
        {
            Type et=typeof(E);
            ObjectQuery<E> oq=_context.CreateQuery<E>("[" + typeof(E).Name + "Set]");

            foreach(System.Reflection.PropertyInfo pi in et.GetProperties())
            {
                if (pi.PropertyType.Name.Contains("EntityCollection"))
                        oq=oq.Include(pi.Name);

            }

            return oq.AsQueryable();
        }

但是钢材在铲斗关系方面存在问题。所以钢铁思考这个问题