我有一个带有子对象(提供者)的实体框架类(文档),该子对象具有对象(文档)的数组。我想拉我的Document
类并包括它的Provider
子类,但不包括提供者的Document
对象的数组。我无法从Provider中删除documents属性,因为在其他时候确实需要documents数组。我该如何使用提供程序提取文档,但使用linq排除每个提供程序文档数组?
这是我的课程结构:
Document {
public string DocumentName { get; set; }
public virtual Provider Provider { get; set; }
}
Provider {
public string Name { get; set; }
public virtual ICollection<Document> Documents { get; set; }
}
我正在尝试使用linq来获取我的文档对象:
db.Documents.Where(x => x.Id == Id)
.Include(x => x.Provider)
.ToList();
结果如下:
[{
'DocumentName': 'document_one.pdf',
'Provider': {
'Name': 'Jim Smith',
'Documents': [
{
'DocumentName': 'document_one.pdf'
},
{
'DocumentName': 'document_two.pdf'
},
]
}
}]
那么,如何在不填充Provider.Documents数组的情况下完成此精确结果集?同样,我无法从Provider类中删除Documents属性,因为我有时需要它。
答案 0 :(得分:0)
假设这仅用于Get,而不仅仅是保存Iterate文档并将其设置为null。
var documents = db.Documents.Where(x => x.Id == Id)
.Include(x => x.Provider)
.ToList()
documents.ForEach(x => x.Provider.Documents = null);
我的猜测是您不希望这样做,因为它在序列化过程中暴露给客户端,如果是这种情况,您可能应该创建一个DTO
答案 1 :(得分:0)
我找到了一篇博客文章和一个SO答案,我将其结合起来回答了我的问题。我必须为文档创建一个特殊的DTO,其中Provider属性也是提供者的特殊DTO。 DTO可以排除属性,然后我必须执行一条select语句,将数据库类转换为DTO,如下所示:
db.Documents.Where(x => x.Id = Id)
.Include(x => x.Provider)
.Select(x => new DocumentDTO{
DocumentName = x.DocumentName,
Provider = new ProviderDTO{
Name = x.Provider.Name
}
})
.ToList();