Msg表(Id,Content,IsDel)。内有 virtual ICollection<MsgDetail> MsgDetails属性
MsgDetail表(Id,MsgId,SubContent,IsDel)
两者是一对多关系。
如何进行如下意思的的筛选?
context.Msg.First(t=>t.Id==1).Include(t=>t.MsgDetail.Where(t=>t.IsDel == false)) //仅筛选IsDel==false的MsgDetails记录。
上述代码 : .Include(t=>t.MsgDetail.Where(t=>t.IsDel == false)) 错误,报错
只能.Include(t=>t.MsgDetail) 后再次linq to object筛选
何解?
可以实现。下面以Blog~Comments 的一对多关系为例解释、书写代码。
db.Configuration.LazyLoadingEnabled = false; //必须关闭延迟加载,否则一旦使用Blog.Comments就会再次查询DB的Comments表,加载Blog下的所以Comments而不筛选IsDel。
Blog blog = db.Blog.Include(b => b.Comments)
.Select(b => new {BlogEntity = b, Comments = b.Comments.Where(c => c.IsDel == false)})
.Where(blogEntity => blogEntity.BlogEntity.Id == id)
.ToList() //立即执行sql查询
.Select(t => t.BlogEntity).First(); //linq to object内存查询、ef自动转换Comments到BlogEntity.Comments
//方法2
//var ret = db.Blog.Include(b => b.Comments)
// .Select(b => new {BlogEntity = b, Comments = b.Comments.Where(c => c.IsDel == false)})
// .FirstOrDefault(blogEntity => blogEntity.BlogEntity.Id == id); //FirstOrDefault
//Blog blog = ret == null ? null : ret.BlogEntity;
参考:http://www.bkjia.com/Asp_Netjc/970649.html
http://stackoverflow.com/questions/25276978/ef-6-add-where-clause-to-an-include-with-navigation-property
context.Msg.First(t=>t.Id==1).Include(t=>t.MsgDetail).selectmany(d=>d.MsgDetail).where(m=>!m.Isdel)
是一种思路,但不对:
1.语法错误、无法编译:.First(t=>t.Id==1)后无法跟上.Include(t=>t.MsgDetail)
2.即使做成: var query = context.Msg.Where(t=>t.Id==1).Include(t=>t.MsgDetail).SelectMany(d=>d.MsgDetail).Where(m=>!m.Isdel); 该语句最后返回的是IQueryable<out MsgDetail>集合类型,而非我需要的Msg主对象实体(内部含IsDel=false的MsgDetails集合)
有其他办法么
@nlh774: 既然无法翻译,那就先tolist下!