Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 当我不知道要加载的属性的名称时,如何进行快速加载?_Asp.net Mvc_Entity Framework_Repository_Lazy Loading_Eager Loading - Fatal编程技术网

Asp.net mvc 当我不知道要加载的属性的名称时,如何进行快速加载?

Asp.net mvc 当我不知道要加载的属性的名称时,如何进行快速加载?,asp.net-mvc,entity-framework,repository,lazy-loading,eager-loading,Asp.net Mvc,Entity Framework,Repository,Lazy Loading,Eager Loading,我有一个通用的存储库,当我使用DoQuery方法从数据库中选择对象时,我需要加载一些相关的实体,以避免在作为外键的字段中获得空值 问题是存储库是通用的,因此我不知道需要加载多少属性或它们的名称,除非有某种方法可以获取它们。我如何使所有外键都加载了它们的实体,同时仍保持此存储库的通用性 以下是DoQuery方法: public ObjectQuery<E> DoQuery(ISpecification<E> where) { ObjectQu

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

我之前发布过一次,但从未得到过答案,但我认为这篇文章更相关,因为在人们认为我知道房产名称之前,我可以:

.includePropertyNameikowneedstobeloaded

下面是一个例子,希望能提供一些关于我在这方面的信息

感谢您的帮助

谢谢,
Matt

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

您可以获取类型的关系结束名,并调用包含所有关系

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

我已经用下一种方法解决了这个问题:

 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();
        }

但它也存在着北斗七星关系的问题。因此,思考这个问题

有人能给我举个例子说明如何做到这一点吗?不太确定从何处开始尝试这一点……您是否至少从调用通用存储库的位置了解了这种关系?如果您按照规则加载所有相关属性,那么在一般情况下,您可能会看到查询性能不佳。这可能会产生重大影响。我通常在查询中使用投影来只加载我需要的类型。我在这里更详细地解释了这一点:是的,我确实从我打电话的那一点就知道了这种关系。我能不能把它传进来,让它根据它来拉他们?示例Anywhere?给了我一个不允许在非泛型声明中使用约束的例子,其中E:newI更正了示例-它必须是DoQuery,而不仅仅是DoQuery