Entity Framework 4 свойства выборочной ленивой загрузки - PullRequest
25 голосов
/ 18 июля 2010

Можно ли загрузить объект, исключая некоторые свойства?Одно из свойств этой сущности дорого выбрать.Я бы хотел лениво загрузить это свойство.Это возможно?

Ответы [ 4 ]

36 голосов
/ 20 июля 2010

Теперь, когда вы прочитали ответ каждого, я дам вам правильный ответ.EF не поддерживает ленивую загрузку свойств.Тем не менее, он поддерживает гораздо более мощную концепцию, чем эта.Это называется разделением таблицы, где вы можете сопоставить таблицу двум объектам.Скажем, таблицу продуктов в базе данных можно сопоставить с сущностью продукта и сущностью ProductDetail.Затем вы можете переместить дорогие поля в сущность ProductDetail, а затем создать связь 1..1 между сущностью prodcut и productdetail.Затем вы можете лениво загружать ассоциацию productdetail только тогда, когда вам это нужно.В моей главе о производительности моей книги я назвал рецепт.13-9.Перемещение дорогой недвижимости в другую организацию

Надеюсь, это поможет!

У Джули Лерман есть статья о том, как разбить таблицу

6 голосов
/ 19 июля 2010

С помощью скалярного свойства единственный способ выборочно не загружать определенное свойство - проецировать в ESQL или L2E:

var q = from p in Context.People
        select new
        {
            Id = p.Id,
            Name = p.Name // note no Biography
        };

+ 1 к Дану; делать это лениво хуже, чем загружать его заранее. Если вы хотите контролировать загрузку, будьте явными.

1 голос
/ 14 мая 2018

Учитывая запрос к DbSet EntityFramework, где целевой объект содержит BigProperty и SmallProperty, Когда вы пытаетесь получить доступ только к SmallProperty без загрузки BigProperty в память:

//this query loads the entire entity returned by FirstOrDefault() in memory
//the execution is deferred during Where; the execution happens at FirstOrDefault
db.BigEntities.Where(filter).FirstOrDefault()?.SmallProperty;

//this query only loads the SmallProperty in memory
//the execution is still deferred during Select; the execution happens at FirstOrDefault
//a subset of properties can be selected from the entity, and only those will be loaded in memory
db.BigEntities.Where(filter).Select(e=>e.SmallProperty).FirstOrDefault();

Поэтому вы можете использовать это поведение, чтобы запрашивать BigProperty только там, где оно вам действительно нужно, и использовать операторы select для явной фильтрации его везде.

Я проверил это с помощью функции использования памяти в средствах диагностики отладки Visual Studio.

1 голос
/ 18 июля 2010

стимов правильно, но будьте осторожны при ленивой загрузке.У вас могут быть проблемы с производительностью, и вы не понимаете, что свойство загружается в определенном месте вашего кода.Это потому, что он загружает данные, когда вы используете свойство

Я предпочитаю использовать явную загрузку.Таким образом, вы знаете, когда они загружаются и где.Вот ссылка, которая дает пример для LoadProperty http://sankarsan.wordpress.com/2010/05/09/ado-net-entity-framework-data-loading-part-2/

. Вы также можете загружать приложения с помощью метода Include.Пример здесь: http://wildermuth.com/2008/12/28/Caution_when_Eager_Loading_in_the_Entity_Framework

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