我看到了一些类似问题的答案,但是我似乎无法找出如何将答案应用于我的问题。
var allposts = _context.Posts
.Include(p => p.Comments)
.Include(aa => aa.Attachments)
.Include(a => a.PostAuthor)
.Where(t => t.PostAuthor.Id == postAuthorId).ToList();
附件可以由作者(类型为Author)或贡献者(类型为Contributor)上传。我想做的是,只获取附件所有者类型为Author的附件。
我知道这样做不起作用并会出错:
.Include(s=>aa.Attachments.Where(o=>o.Owner is Author))
我在这里读到了关于“Filtered Projection”的内容。
编辑-文章链接:http://blogs.msdn.com/b/alexj/archive/2009/10/13/tip-37-how-to-do-a-conditional-include.aspx,
但我就是无法理解它。
我不想将筛选器包含在最终的where子句中,因为我想要所有帖子,但我只想检索属于作者的那些帖子的附件。
编辑2:-请求发布架构
public abstract class Post : IPostable
{
[Key]
public int Id { get; set; }
[Required]
public DateTime PublishDate { get; set; }
[Required]
public String Title { get; set; }
[Required]
public String Description { get; set; }
public Person PostAuthor { get; set; }
public virtual ICollection<Attachment> Attachments { get; set; }
public List<Comment> Comments { get; set; }
}
Linq2Sql
会将你的代码转换成原始的SQL
,并通过连接返回子行。你无法在SQL
中进行这种条件连接。你唯一的选择是删除.Include(aa => aa.Attachments)
,然后有第二个查询根据所有者是否为作者/贡献者返回附件。 - Rob