如何在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。

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

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
            };

如果您想要列的子集,您必须使用投影到匿名或自定义类型,或者为查询创建特定的数据库视图,并将其映射到新的只读实体。Include总是加载所包含实体的所有列(所以另一种方法是通过表拆分来划分实体,但这看起来有些过头了)。此外,Include的使用非常有限——根查询的形状不能更改,所以一旦使用任何自定义投影或联接,Include就无法工作。

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