Как я могу загружать, когда я не знаю название свойства, которое я хочу загрузить? - PullRequest
1 голос
/ 23 декабря 2009

У меня есть общий репозиторий, и когда я использую метод 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")

Вот вопрос, который я отправил до , надеюсь, он даст немного информации о том, где я нахожусь с этим.

Любая помощь приветствуется.

Спасибо,
Matt

Ответы [ 3 ]

0 голосов
/ 23 декабря 2009

Вы можете получить имена концов отношений для типа и вызвать Включить для всех отношений.

    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 из запрашиваемого типа. Надеюсь, это поможет.

0 голосов
/ 30 декабря 2009

Я решил эту проблему следующим образом:

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

но у стали проблемы с ковшом. Поэтому стали думать об этой проблеме

0 голосов
/ 23 декабря 2009

Вам нужно будет инвертировать элемент управления, передав в метод глубину, к которой следует обращаться. Я недостаточно знаком с платформой Entity, чтобы точно понять, как это сделать. Вы можете передать целое число, представляющее глубину выборки, и метод может выяснить, как построить запрос со связанными сущностями на эту глубину.

...