C# Linq EF Include()和Select()包含新类型 context.Projects .Include(x=>x.Members)//列出公共类成员 .Include(x=>x.Members.Select(z=>z.City))//公共类城市 .ToList();
从项目中选择 包括项目的列表。成员 包括每个项目。成员。城市 需要在结果中添加一些数据吗C# Linq EF Include()和Select()包含新类型 context.Projects .Include(x=>x.Members)//列出公共类成员 .Include(x=>x.Members.Select(z=>z.City))//公共类城市 .ToList();,c#,entity-framework,linq,C#,Entity Framework,Linq,从项目中选择 包括项目的列表。成员 包括每个项目。成员。城市 需要在结果中添加一些数据吗 context.Projects .包括(x=>x.Members) .Include(x=>x.Members.Select(z=>z.City)) .选择(x=>new{ 项目=x, 金额=22 }) .ToList(); 项目属性已填充,但成员为空 问题1-如何将项目成员纳入新{Project=x} 我下一步做什么 context.Projects .Include(x=>x.Members)//列
context.Projects
.包括(x=>x.Members)
.Include(x=>x.Members.Select(z=>z.City))
.选择(x=>new{
项目=x,
金额=22
})
.ToList();
项目属性已填充,但成员为空
问题1-如何将项目成员纳入新{Project=x}
我下一步做什么
context.Projects
.Include(x=>x.Members)//列表
.Include(x=>x.Members.Select(z=>z.City))//城市是导航属性
.选择(x=>new{
项目=x,
成员=x。成员,
金额=22
})
.ToList();
项目属性已填充,成员已填充,但成员[0]。城市为空
问题2-如何填充成员[0]。城市
附言
实体框架6
公共类项目
{
公共Guid Id{get;set;}
公共字符串名称{get;set;}
公共列表成员{get;set;}
}
公共类项目成员
{
公共Guid项目ID{get;set;}
公共项目{get;set;}
公共Guid CityId{get;set;}
公共城市城市{get;set;}
}
附言
这是一项工作,但是代码开销很大
context.Projects
.Include(x=>x.Members)//列表
.Include(x=>x.Members.Select(z=>z.City))//城市是导航属性
.选择(x=>new{
项目=x,
Members=x.Members.选择(z=>new{
项目=z,
城市
}).ToList(),
金额=22
})
.ToList();
将您的导航属性声明为虚拟,将其列表为ICollection,并在对实体进行水合处理时将EF替换为其具体实现:
public class Project
{
public Project {
Members = new HashSet<ProjectMember>();
}
public Guid Id { get; set; }
public string Name { get; set; }
public virtual ICollection<ProjectMember> Members { get; set; }
}
public class ProjectMember
{
public Guid ProjectId { get; set; }
public virtual Project Project { get; set; }
public Guid CityId { get; set; }
public virtual City City { get; set; }
}
公共类项目
{
公共项目{
Members=newhashset();
}
公共Guid Id{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection成员{get;set;}
}
公共类项目成员
{
公共Guid项目ID{get;set;}
公共虚拟项目{get;set;}
公共Guid CityId{get;set;}
公共虚拟城市城市{get;set;}
}
在包含之后执行的任何操作(过滤除外)都将导致丢弃包含。通过在include之后调用AsEnumerable
,您将确保执行查询,其余操作将在内存中完成:
context.Projects
.Include(x => x.Members)
.Include(x => x.Members.Select(z => z.City))
.AsEnumerable()
.Select(x => new { Project = x, Amount = 22 })
.ToList();
这是EF 6还是EF 7?可以显示您的项目类吗?添加信息:EntityFramework 6和部分类您可以尝试将
.Include()
移动到语句末尾,如.Include(x=>x.Project.Members)。Include(x=>x.Project.Members)。选择(z=>z.City)
Move或Add to end=“查询的结果类型既不是EntityType,也不是具有实体元素类型的CollectionType。只能为具有以下结果类型之一的查询指定包含路径。“声明为虚拟-序列化为json有很多问题。我需要在加载时管理哪个属性(包含)我知道这是一个迟来的评论,但实体几乎不应该被序列化为JSON。在序列化之前,将您需要的属性映射到模型中,以避免可怕的“在实体上找到循环引用…”错误。奇怪的是,我使用的是EF 6.0,我的Include只接受Include(“表”)或nameof(表)手动添加using for system.data.entity,则lambda也可用