C# 如何仅包含实体的一部分
我有一个linq查询,它工作得很好C# 如何仅包含实体的一部分,c#,entity-framework,asp.net-core,entity-framework-core,C#,Entity Framework,Asp.net Core,Entity Framework Core,我有一个linq查询,它工作得很好 var items = this._context.History.Where(a => a.ItemId == id).Include(a=> a.AppUser.ApplicationUser).ToList(); 但是,有一个问题。包括应用程序用户,以获取用户的名字和姓氏。但剩下的部分是不需要的 真正的问题是,由于ApplicationUser现在位于上下文中,因此一个完全不同的查询(不包括ApplicationUser)最终会填充Ap
var items = this._context.History.Where(a => a.ItemId == id).Include(a=> a.AppUser.ApplicationUser).ToList();
但是,有一个问题。包括应用程序用户
,以获取用户的名字
和姓氏
。但剩下的部分是不需要的
真正的问题是,由于ApplicationUser
现在位于上下文中,因此一个完全不同的查询(不包括ApplicationUser
)最终会填充ApplicationUser
,并将其发送到客户端(安全性)
但我真正需要的是这个表中的ApplicationUser.FirstName
和ApplicationUser.LastName
我能想到的唯一解决办法是为一个查询创建一个新的
Context()
,但这似乎违反了正在使用的D.I.模式。无需保存更改,只需获取数据以供显示。为什么不为每个查询返回DTO?@CodeNotFound您可以给我一个示例吗?您创建的DTO类只包含所需的属性,并使用该类将EF结果投影到该类。“它只是获取数据以供显示”然后创建一个只包含显示所需数据的类(也称为ViewModel、DTO等),并使用投影查询(Select
)填充该类。实体类和即时加载用于表示完整的表记录数据(而不是部分查询)。如果要明确告诉上下文不要跟踪检索的实体,您可能还需要查看.AsNoTracking()
。在某些情况下,它也可以提高性能。
this.DbSet.Where(a => a.EntityStatusId == (int)EntityStatus.Enum.Active && a.ItemId == entityId ).Include(a=> a.AppUser).ToList();