如何在Linq中仅对选定列使用INCLUDE
本文关键字:INCLUDE Linq | 更新日期: 2023-09-27 18:21:50
我的场景中有多个具有表对象关联的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()
在将所有这些表连接到一个查询中之后,我选择User对象。当然,我会得到列表,但我希望每个用户对象都应该包括其各自的组、权限、车辆,但从车辆和权限中,我只想加载几个列/属性,而不是全部。那么,在这种情况下,我如何指定要加载哪些列呢?
我使用的是实体框架4.1+C#+SQL Server。
如果只想选择指定的列,可以创建匿名类型或具有无参数构造函数的类。
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
};
如果您想要列的子集,您必须使用投影到匿名或自定义类型,或者为查询创建特定的数据库视图,并将其映射到新的只读实体。Include
总是加载所包含实体的所有列(所以另一种方法是通过表拆分来划分实体,但这看起来有些过头了)。此外,Include
的使用非常有限——根查询的形状不能更改,所以一旦使用任何自定义投影或联接,Include
就无法工作。
EF是ORM——一旦映射了实体,您将始终处理整个实体,而不仅仅是它的一部分。如果需要处理实体的一部分,则必须使用到非实体类(非映射)的投影。