EF:如何使用自定义选择器来投影相关实体?

时间:2014-02-06 16:39:18

标签: c# linq entity-framework

假设我有2个实体(1对多)关系:ComponentPart,如此:

public Component
{
   string CompName { get; set; }
   byte[] CompBlob { get; set; }
   ICollection<Part> Parts { get; set; }
}
public Part
{
   string PartName { get; set; }
   byte[] PartBlob { get; set; }
}

当我加载Component时,我希望始终为此特定实体加载其Parts

我想知道如何选择/投射组件列表,以便EF不会加载其他内部属性(例如:只加载CompNamePartName CompBlob和内PartBlob)。

可能如下所示,但如何为Parts应用选择器?

//
dbContext.Components.Include(c => c.Parts).Where(filterComponents).Select(.?.)
//

如果需要,我将LazyLoadingEnabled设置为false

2 个答案:

答案 0 :(得分:2)

如果您正在使用实体框架,则需要为每个实体添加主键,如下所示:

public class Component
{
    public int Id { get; set; }
    public string CompName { get; set; }
    public byte[] CompBlob { get; set; }
    public ICollection<Part> Parts { get; set; }
}
public class Part
{
    public int Id { get; set; }
    public string PartName { get; set; }
    public byte[] PartBlob { get; set; }
}

然后进行如下查询:

LazyLoading禁用案例:

var result = dbContext.Components.Include("Parts").Select(m => new 
             {m.CompName, PartNames = m.Parts.Select(n => n.PartName)}).ToList();

LazyLoading Enabled Case:

 var result = dbContext.Components.Select(m => new 
         {m.CompName, PartNames = m.Parts.Select(n => n.PartName)}).ToList();

答案 1 :(得分:1)

如果我理解正确的话......

var query = dbContext.Components.Select(x => new {
        CompName = x.CompName,
        Parts = x.Parts.Select(p => p.PartName)
    }).ToList();

根据需要添加其他过滤器和选择器。您可能/可能不需要Include语句(.Include(“Parts”))