C# Lambda包含限制列

C# Lambda包含限制列,c#,linq,lambda,C#,Linq,Lambda,我有一个对象“Property”,它有子对象“Notes”和“Attachments”。 我想带回整个“属性”,所有相关的“注释”,但只是“附件”中的一个字段。我不想带回整个“附件”,因为它包含base64图像,这是巨大的。如果我需要这些,我可以通过“附件ID”获得它们。问题是在使用Lambda Include时,如何缩小字段范围。下面的方法行不通。我真的不想创造一个冗长的LINQ声明 var property = await _context.Property

我有一个对象“Property”,它有子对象“Notes”和“Attachments”。 我想带回整个“属性”,所有相关的“注释”,但只是“附件”中的一个字段。我不想带回整个“附件”,因为它包含base64图像,这是巨大的。如果我需要这些,我可以通过“附件ID”获得它们。问题是在使用Lambda Include时,如何缩小字段范围。下面的方法行不通。我真的不想创造一个冗长的LINQ声明

var property = await _context.Property
                .Include(x => x.Notes)
                .Include(x => x.Attachments.Select(y => new PropertyAttachment
                {
                    PropertyId = y.PropertyId,
                    AttachmentId = y.AttachmentId,
                    Type = y.Type,
                    Title = y.Title,
                    Content = ""
                }).ToList())
                .SingleOrDefaultAsync(x => x.PropertyId == key);

使用select和anonymous类型,您可以这样尝试

var property = _context.Property.Select(x => new 
   { Property = x,
     HMOUnits = x.HMOUnits,
     Notes = x.Notes,
     AttachmendId = new { Id = x.Attachments.Select(z=> z.AttachmentId) }
   })
   .SingleOrDefaultAsync(x =>
        x.Property.ID == key &&
       (RestrictUser(User) ? x.Property.Tenancies.Any(y => y.Assignments.Any(z => z.Tenant.UserID == Convert.ToInt32(User.Identity.Name))) : true) 
   );

因此,您需要使用Linq
Select
将数据投影到新格式。请看,正如您在源代码中看到的那样,我尝试了这一点……但导致语法问题。但是您没有告诉我们这些语法问题是什么,恐怕我们猜不到。更改了代码,但得到错误:属性表达式“x=>{from PropertyAttachment y in x。附件选择new PropertyAttachment(){PropertyId=[y]。PropertyId,AttachmentId=[y].AttachmentId,类型=[y]。类型,标题=[y]。标题,内容=}}。ToList()无效。表达式应表示属性访问:“t=>t.MyProperty”。有关包含相关数据的更多信息,请参见。我尝试过这样做,但由于“属性”被视为具有子集合的对象,因此这会导致下游(Angular 4)出现更多问题。这是索鲁。将创建属性为对象的对象。当然,我可以列出所有字段,但仍然使用指定的集合。您必须创建一个新的对象类型,因为属性对象的类型没有属性AttachmendId。我在这里创建了一个匿名类型,甚至是一个异常类型…它会产生相同的错误var property=await\u context.property.Include(x=>x.Notes).Include(x=>x.Attachments.Select(y=>new{PropertyId=y.PropertyId,AttachmentId=y.AttachmentId,Type=y.Type,Title=y.Title,Content=”“})。SingleOrDefaultAsync(x=>x.PropertyId==key);在包含函数中,我们可以使用父对象中的现有导航属性。我们不能使用任何选择。