Как использовать INCLUDE в Linq только для выбранных столбцов? - PullRequest
3 голосов
/ 27 января 2012

У меня есть сценарий с несколькими методами linq include с ассоциациями табличных объектов. Предположим, что сценарий:

User has Groups
User has Permissions
User has Vehicles

var _users=
(from u in dbconetxt.Users
join g in dbconetxt.Gropus on u.userId equals g.userId
join p in dbconetxt.Permissions on u.userId equals p.userId
join v in dbconetxt.Vehicles on u.userId equals v.userId
Where u.Status=true
select u).Include(u.Groups)
         .Include(u.Permissions)
         .Include(u.Vehicles)
         .ToList()

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

Я использую Entity Framework 4.1 + C # + SQL Server.

Ответы [ 2 ]

6 голосов
/ 27 января 2012

Включить - это метод расширения, прикрепленный к IQueryable.Это означает, что вы должны использовать его для пользователей DbSet.

Если вы хотите выбрать только указанные столбцы, вы можете создать анонимный тип или класс с конструктором без параметров.

var users = from u in dbContext.Users.Include(u => u.Groups)
            where u.Status == true
            select new 
            {
                u.Name,
                u.Id,
                u.WhatSoEver
            };

или

var users = from u in dbContext.Users.Include(u => u.Groups)
            where u.Status == true
            select new UserView
            {
                Name = u.Name,
                Id = u.Id,
                Property1 = u.WhatSoEver
            };
3 голосов
/ 27 января 2012

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

EF - это ORM - когда вы отобразите объект, вы будетевсегда работай со всей сущностью, а не только со своей частью.Если вам нужно работать с частью объекта, вы должны использовать проекцию на класс, отличный от объекта (не сопоставленный).

...