如何使用linq排除孙子

时间:2018-08-13 18:05:17

标签: entity-framework linq

我有一个带有子对象(提供者)的实体框架类(文档),该子对象具有对象(文档)的数组。我想拉我的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属性,因为我有时需要它。

2 个答案:

答案 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();

博客文章here
所以回答here