Entity - Linq to Sql Загружать только часть объекта - PullRequest
2 голосов
/ 15 мая 2009

Если я использую Entity Framework с linq to sql для запроса и у меня есть объект Person, но мне нужно только два свойства этого объекта, что в памяти будет загружено, весь объект?

Пример:

Я получил юридическое лицо Лицо со свойствами: Имя, Возраст, Адрес, Страна, Язык ...

Мне нужно использовать только имя и возраст. Поэтому мне не нужно загружать адрес, страну и другое свойство ... что будет в памяти и какой тип запроса будет запрашиваться в SQL?

Если мой запрос Linq:

public IQueryable<Person> FindAllPersons()
{
    return from person in db.Persons
           select person;
}

А позже в коде я вызываю только свойства Name и Age каждого персонажа в списке.

Ответы [ 6 ]

3 голосов
/ 15 мая 2009

В качестве альтернативы вы можете установить Delay Loaded на true для всех столбцов, которые вы не хотите загружать мгновенно.

2 голосов
/ 15 мая 2009

Хотя это не является абсолютно необходимым, вы можете указать, используете ли вы EF или Linq2SQL. Однако в зависимости от того, какой из них вы на самом деле используете, SQL может быть другим.

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

Чтобы загрузить только имя и возраст ..

var list = db.Persons.Select(person => new Person() { Age = person.Age, Name = person.Name });
2 голосов
/ 15 мая 2009

Если вы выберите весь объект персонажа с помощью LINQ, то при доступе к этому объекту весь человек будет загружен в память. Если вы хотите выбрать только определенные поля, вы должны уточнить критерии выбора. Например:

var persons = from p in db.Persons select new { p.Name, p.Age };
2 голосов
/ 15 мая 2009

Вы можете запросить только те поля, которые вам нужны.

Вот так,

public IQueryable<Person> FindAllPersons()
{
    return from person in db.Persons
           select new Person(){Name = person.Name, Age = person.Age};
}
1 голос
/ 19 мая 2009

Каждый столбец сущности в конструкторе имеет свойство Delay Loaded. Установка его в значение true (значение по умолчанию - false) отключает мгновенную загрузку свойства, оно будет загружено только при обращении к нему в коде.

0 голосов
/ 06 апреля 2011
public IQueryable<Persons> GetApplicationRoleList()
    {
        return DBContext.Persons.AsQueryable();
    }

;)

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