Entity Framework - Загрузить только выбранные свойства - PullRequest
5 голосов
/ 10 ноября 2011

Я не имею опыта испытывать это EF и, следовательно, не знаю актуальности вопроса. Предположим, у меня есть таблицы с именем Student (StudentId, Имя, Имя пользователя, Адрес, DOB, DeptId, NavigationProp1Id ....) и в таблице Depatement (Deptd, DeptName., NavigationProPid). Таким образом, если структура таблицы выглядит следующим образом, когда я использую 'contex.Studnets', я могу получить все свойства вместе с ней, включая свойства навигации, и если таблица 2 имеет другие свойства навигации, она также может быть загружена. Я прав ?

Если это так, может ли это вызвать проблемы с производительностью? Могу ли я загрузить только выбранные свойства из Entity, например, только UserName, Addres from Studnet enity?

Любая помощь будет принята с благодарностью

Спасибо и С уважением

Boney

Ответы [ 2 ]

19 голосов
/ 10 ноября 2011

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

Вы можете загрузить только выбранные свойства - это называется проекцией. Ограничение состоит в том, что вы не можете загружать сущность Student с подмножеством свойств. Вам нужен либо новый класс, либо анонимный тип:

var query = context.Students.Select(x => new 
                {
                   x.UserName,
                   x.Address 
                }); 
1 голос
/ 10 ноября 2011

При использовании Entity Framework (EF) лучшим решением является запрос контекста EF с помощью LINQ (http://msdn.microsoft.com/en-us/library/bb308959.aspx). LINQ можно использовать для запроса по взаимосвязям, поэтому в вашем сценарии ваш код будет выглядеть следующим образом:

var joinedlist = context.Student.Join(
                // The table we wish to join to the Student table
                context.Department,
                // Item on student table we want to join from
                studentItem => studentItem.DeptId,
                // Item on department table we want to join to
                departmentItem => departmentItem.Deptd, 
                // New object just holding the values we wish to retrieve from the joined tables
                (studentItem, departmentItem) => new {
                        StudentId = studentItem.StudentId, 
                        StudentUsername = studentItem.Username,
                        StudentAddress = studentItem.Address,
                        DepartmentName = departmentItem.DeptName, 
                        Navigation = StudentItem.NavigationProp1Id
                    }
            );

Приведенный выше код сгенерирует для вас запрашиваемый список, но вы можете многое сделать с LINQ. Например, выбрав подмножество данных и отфильтровав результаты:

var singleItem = joinedlist
                // Filter our joined list
                .Where(item => item.StudentId.Equals(1))
                // Select only a subset of columns
                .Select(item => new {item.StudentUsername, item.StudentAddress})
                // Return only a single item
                .FirstOrDefault();

Что касается производительности - я бы посоветовал приобрести профилировщик, который может показать вам вывод SQL ваших операторов LINQ на EF. Это действительно помогает, когда дело доходит до понимания отложенной загрузки и когда неуместный .ToList () может возвращать всю вашу БД!

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