1

我有一个通用存储库,当我使用 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;
    }

以及指向整个存储库的原始代码的链接。

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

.Include("PropertyNameIKnowNeedsToBeLoaded")

这是我之前发布的问题,希望能提供一些关于我在哪里的信息。

任何帮助表示赞赏。

谢谢,
马特

4

3 回答 3

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。我希望这有帮助。

于 2009-12-23T10:41:33.513 回答
0

您必须通过将应获取的深度传递给方法来反转控件。我对实体框架不够熟悉,不知道如何做到这一点。您可以传入一个表示提取深度的整数,该方法可以计算出如何构造与该深度的相关实体的查询。

于 2009-12-23T04:22:48.100 回答
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();
        }

但它与北斗的关系存在问题。所以钢铁思考这个问题

于 2009-12-30T10:54:25.427 回答