Entity Framework - извлечение связанных данных - PullRequest
1 голос
/ 22 февраля 2011

У меня есть действие контроллера ASP.net MVC, которое извлекает список элементов из моей модели сущности.Для этой сущности есть несколько свойств, которых нет в самой сущности.Я создал частичный класс для добавления этих свойств:

public partial class Person
{
    public int Extra
    {
        get
        {
            using( var ctx = new DBEntities() )
            {
                return ctx.OtherTable.Count(p => p.PersonID == this.PersonID);
            }
        }
    }
}

Как видите, свойство, к которому мне нужен доступ, происходит из другой таблицы.На моей странице MVC ... мне нужно вернуть большое количество людей (более 100 на страницу).Чтобы отобразить это дополнительное поле, каждая сущность Person будет обращаться к базе данных отдельно ... что было крайне неэффективно.У меня есть один запрос, чтобы вернуть всех людей, а затем для каждого человека это запрос для каждого свойства, которое у меня есть, как это.Это может привести к 300 вызовам в базу данных, выполнение которых занимает много времени.

Какой лучший способ сделать это?В идеале я хотел бы выполнить один запрос, который возвращает все люди и дополнительные данные, но я также хотел бы, чтобы дополнительные данные были частью сущности Person, даже если они находятся в отдельной таблице в базе данных.

Обновление
Чтобы добавить немного больше контекста из комментариев.

Я возвращаю People из класса репозитория.В другом вопросе мне сказали, что хранилище должно иметь дело только с самими сущностями.Так что код, который извлекает людей, выглядит так:

class PersonRepository
{
    public IQueryable<Person> GetPeople() {
        return from p in db.People
               where p ...
               select p;
    }
}

У меня нет возможности присоединиться в этом случае.

Ответы [ 2 ]

1 голос
/ 22 февраля 2011

Вы можете сделать объединения:

var result = 
    from p in ctx.Persons
    from a in ctx.OtherTable
    where p.PersonID == personID
    select new SomeViewModel 
    {
        Name = p.Person.Name,
        OtherTableValue = a.OtherValue
    };
1 голос
/ 22 февраля 2011

Я не уверен, как устроен ваш дизайн базы данныхНо почему вы не можете объединить данные из двух связанных таблиц и нажать на них один раз, а не несколько раз?Даже если это слишком медленно для вас, вы также можете кэшировать эти данные и иметь доступ к ним в течение всего сеанса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...