2016-09-07 53 views
1

我有一个包含可以具有属性Id,Name和BinaryData的附件的Punches的模型。在EF6中只包含部分实体包括

如果我这样做:

var result = context.PunchSet 
    .Where(p => p.PunchType == punchType && p.Project.Id == projectId) 
    .Include(c => c.Contractor) 
    .Include(c => c.ClearedBy) 
    .Include(c => c.CreatedBy) 
    .Include(a => a.Attachments) 

查询是慢如molassis因为附件既可以是很多大。在这种情况下,我需要的是附件的ID和名称。所以,我想:

var result = context.PunchSet 
    .Where(p => p.PunchType == punchType && p.Project.Id == projectId) 
    .Include(c => c.Contractor) 
    .Include(c => c.ClearedBy) 
    .Include(c => c.CreatedBy) 
    .Include(a => a.Attachments.Select(a2 => new Attachment() { Id=a2.Id, Name=a2.Name}); 

但与此错误结束:

The Include path expression must refer to a navigation property defined on the type. Use dotted paths for reference navigation properties and the Select operator for collection navigation properties. Parameter name: path

有不知道这意味着什么,我一直坚持了几个小时。如何在结果中包含部分实体?即不要读取二进制数据。

+0

不能部分包括您可以迭代。但是,如果您只想阅读而不更新,则可以在附件上省略附件并单独加载附件。 – grek40

+1

我该如何在同一个查询中做到这一点?我不想加载500拳,然后必须通过循环来获取任何附件(如果有的话)。这将是一个好的旧SQL 5分钟的工作。有时这个EF6的东西正在让我。 – Paaland

+1

如果您需要加载部分相关的实体,则需要使用匿名类型或DTO来投影您的查询​​。作为异常解释,你只能在'Include'扩展方法中引用导航属性 – octavioccl

回答

1

您可以尝试在单个查询中选择所有需要的属性,然后将它们一起存储在内存中。

db.PunchSet 
    .Include(x => x.Contractor) 
    // ... other includes of complete objects 
    // then select properties for partial include 
    .Select(x => new { obj = x, att = x.Attachments.Select(a => new { a.Id, a.Name }) }) 
    // end of database query context 
    .AsEnumerable() 
    // join the results in memory 
    .Select(x => 
    { 
     x.obj.Attachments = x.att.Select(a => new Attachment() { Id = a.Id, Name = a.Name }).ToList(); 
     return x.obj; 
    }); 
0

您可以尝试如下所示。

var result = from p in context.PunchSet 
       where (p.PunchType == punchType && p.Project.Id == projectId) 
       select new { 
          p, 
          Contractor=p.Contractor, 
          ClearedBy =p.ClearedBy, 
          CreatedBy=p.CreatedBy, 

          Attachments= from a in p.Attachments 
             select new { 
                Id= a.Id, 
                Name =a.Name, 
                }, 

      }; 

var result2 = result.AsEnumerable() 
        .Select(c => c.p); 

之后,你想:)

foreach(var r in result2) 
{ 
    foreach(var a in r.Attachments) 
    { 
     //your code; 
    } 
}