如何在Linq中仅为选定列使用INCLUDE?

时间:2012-01-27 09:11:47

标签: c# sql-server linq include entity-framework-4.1

我正在使用具有表对象关联的多个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()

在单个查询中加入所有这些表后,我选择了用户对象。当然,我会得到List,但我希望每个用户对象都应包含其各自的组,权限,车辆,但是来自车辆和权限,我只想加载少数列/属性,而不是全部。那么,如何在此场景中指定要加载的列?

我使用的是Entity Framework 4.1 + C#+ SQL Server。

2 个答案:

答案 0 :(得分:6)

Include是附加到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
            };

答案 1 :(得分:3)

如果需要列的子集,则必须使用投影到匿名或自定义类型,或为查询创建特定的数据库视图,并将其映射到新的只读实体。 Include将始终加载所包含实体的所有列(因此其他方法是将实体与表拆分分开但看起来有点过分)。此外Include的用法非常有限 - 根查询的形状不得更改,因此一旦您使用任何自定义投影或加入Include将无效。

EF是ORM - 一旦你映射实体,你将始终与整个实体合作,而不仅仅是它的一部分。如果您需要使用实体的一部分,则必须使用投影到非实体类(非映射)。