EntityFramework中的ConditionalContains()varallposts=_context.Posts.Include(p=>p.Comments).Include(aa=>aa.Attachments).Include(a=>a.PostAuthor).Where(t=>t.PostAuthor.Id==postAuthorId).ToList();附件可以由作者(类型Author)或贡献者(类型Contributor)上传。我想要做的是,只获取附件所有者属于作者类型的附件。我知道这不起作用并给出错误:.Include(s=>aa.Attachments.Where(o=>o.OwnerisAuthor))我在这里阅读了过滤投影编辑-链接到文章:://blogs.msdn.com/b/alexj/archive/2009/10/13/tip-37-how-to-do-a-conditional-include.aspx,但我无法理解。我不想在最后的where子句中包含过滤器,因为我想要所有帖子,但我只想检索属于作者的那些帖子的附件。编辑2:-请求发布模式publicabstractclassPost:IPostable{[Key]publicintId{get;放;}[必需]publicDateTimePublishDate{get;放;}[必需]publicStringTitle{get;放;}[必需]publicStringDescription{get;放;}publicPersonPostAuthor{get;放;}publicvirtualICollectionAttachments{get;放;}公共列表评论{get;放;从您发布的链接我可以确认该技巧有效,但仅适用于一对多(或多对一)关系。在这种情况下,您的Post-Attachment应该是一对多的关系,因此它可以完美地工作。这是您应该拥有的查询://这应该暂时禁用_context.Configuration.LazyLoadingEnabled=false;varallposts=_context.Posts.Where(t=>t.PostAuthor.Id==postAuthorId).Select(e=>new{e,//用于后面的投影e.Comments,//缓存评论//缓存过滤后的附件附件=e.Attachments.Where(a=>a.OwnerisAuthor),e.PostAuthor//缓存PostAuthor})。AsEnumerable().Select(e=>ee).ToList();您可以使用此实现的扩展方法(例如)Include2()。之后可以调用:_context.Posts.Include2(post=>post.Attachments.Where(a=>a.OwnerId==1))以上代码只包含Attachment.OwnerId==1。从“附件”导航属性中删除虚拟关键字以防止延迟加载:publicICollectionAttachments{get;放;第一种方法:发出两个单独的查询:一个用于帖子,一个用于附件,让关系修复完成其余:ListpostsWithAuthoredAttachments=_context.Posts.Include(p=>p.Comments).Include(p=>p.PostAuthor).Where(p=>p.PostAuthor.Id==postAuthorId).ToList();ListfilteredAttachments=_context.Attachments.Where(a=>a.Post.PostAuthor.Id==postAuthorId).Where(a=>a.OwnerisAuthor).ToList()关系修复意味着您可以通过Post的导航属性访问Second这些过滤附件的方法:对数据库执行单个查询,然后执行内存中查询:varquery=_context.Posts.Include(p=>p.Comments).Include(p=>p.PostAuthor).Where(p=>p.PostAuthor.Id==postAuthorId).Select(p=>new{Post=p,AuthoredAttachments=p.AttachmentsWhere(a=>a.OwnerisAuthor)});我将在此处使用匿名类型varpostsWithAuthoredAttachments=query.ToList()或者我将创建一个ViewModel类以避免匿名输入::列出postsWithAuthoredAttachments=query.//你可以“内联”这个变量。AsEnumerable()//强制数据库查询按原样运行——将数据拉入内存。Select(p=>p)//从内存中解包结果.ToList()Include()Lambda可能只指向一个属性:.Include(a=>a.Attachments).Include(a=>a.Attachments.Owner);你的情况对我来说没有意义,因为Include()意味着加入,你要么有条件地做要么不做。你会如何用原始SQL编写它?为什么不这样:context.Attachments.Where(a=>a.Owner.Id==postAuthorId&&a.Owner.Type==authorType);?假设“a”是“YourType”类型,条件包含可以通过使用方法扩展来解决,例如publicstaticclassQueryableExtensions{publicstaticIQueryableConditionalInclude(thisIQueryablesource,boolinclude)whereT:YourType{if(include){返回源.Include(a=>a.Attachments).Include(a=>a.Attachments.Owner));}返回源;}}...然后像使用它一样使用它。包括,比如上面是C#学习教程:实体框架中的条件包括()分享的所有内容,如果对大家有用,需要详细了解C#学习教程,希望大家点赞更多关注——boolyourCondition;.ConditionalInclude(yourCondition)本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
