假设我有2个实体(1对多)关系:Component
和Part
,如此:
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不会加载其他内部属性(例如:只加载CompName
和PartName
但不 CompBlob
和内PartBlob
)。
可能如下所示,但如何为Parts
应用选择器?
//
dbContext.Components.Include(c => c.Parts).Where(filterComponents).Select(.?.)
//
如果需要,我将LazyLoadingEnabled
设置为false
答案 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”))