我正在使用具有表对象关联的多个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。
答案 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 - 一旦你映射实体,你将始终与整个实体合作,而不仅仅是它的一部分。如果您需要使用实体的一部分,则必须使用投影到非实体类(非映射)。