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也可用