Entity Framework 6如何进行导航属性的筛选(context.Msg.First(t=>t.Id==1).Include(t=>t.MsgDetail),筛选MsgDetail带条件)

问题: https://q.cnblogs.com/q/98333/

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

Entity Framework 6如何进行导航属性的筛选(context.Msg.First(t=>t.Id==1).Include(t=>t.MsgDetail),筛选MsgDetail)

0

[待解决问题] 浏览: 16次 

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.Where(t=>t.IsDel == false)

何解?

时间: 2024-08-05 11:15:18

Entity Framework 6如何进行导航属性的筛选(context.Msg.First(t=>t.Id==1).Include(t=>t.MsgDetail),筛选MsgDetail带条件)的相关文章

Entity Framework json 序列化含有导航属性的实体

public ActionResult User_Query2()        {            //通过用户手机号查寻 该用户的所有邮包记录            string User_Tel1 = Request.Form["User_Tel"];            if (User_Tel1 == null)            {                return HttpNotFound();            }            Lis

Entity Framework Code First 映射配置属性

实体与数据库的映射可以通过DataAnnotation与FluentAPI两种方式来进行映射: DataAnnotation DataAnnotation 特性由.NET 3.5中引进,给.NET中的类提供了一种添加验证的方式.DataAnnotation由命名空间System.ComponentModel.DataAnnotations提供.下面列举实体模型中常用的DataAnnotation特性: KeyAttribute:对应数据库中的主键 RequiredAttribute:对应数据库中

entity framework—利用导航属性添加数据

entity framework中可以利用导航属性去添加数据. 当两张表有主外键关系的时候,并且在两张表中添加的数据都是不存在的数据,便可以利用导航属性去插入数据.例如下面的两张表: 当向两张表中去添加新数据时可以这样写,便可将两条数据都添加到数据表中. private void Form1_Load(object sender, EventArgs e) { testEntities te=new testEntities(); //定义一个上下文实例 Customer customer =

MVC5 Entity Framework学习之更新相关数据

在上篇文章中学习了如何在页面中显示相关数据,本节中将学习如何对相关数据进行更新.对于大多数实体关系,可以通过更新外键或导航属性来更新数据,对于多对多关系,Entity Framework不会直接公开连接表,所以你需要通过相应的导航属性来添加和移除实体. 先看完成后的效果图 为Courses自定义Create 和Edit 页面 当一个新的course实体被创建时,该实体必须关联到一个已存在的department.要做到这一点,生成的框架代码应该要包括控制器方法和用于选择department的下列列

MVC5 Entity Framework学习之读取相关数据

前一篇文章中完成了School 数据模型,接下来你将学习如何读取和显示相关的数据--这里指Entity Framework加载至导航属性中的数据. 下图是完成后的效果图 延迟.预先和显示加载相关数据 Entity Framework可以通过多种方法向实体的导航属性中加载数据 延迟加载(Lazy loading) 当实体第一次被读取时,相关数据并不会被检索.但是,当你第一次访问导航属性时,该导航属性所需的数据会自动加载.这是向数据库发送多个查询语句的结果--一次是读取实体本身,接着是每次与被检索的

Entity Framework技巧系列之十二 - Tip 46 - 50

提示46. 怎样使用Code-Only排除一个属性  这次是一个真正简单的问题,由StackOverflow上这个问题引出.  问题:  当我们使用Code-Only把一个类的信息告诉Entity Framework,默认情况下每个属性会成为Entity的一部分,并作为一个存储于数据库中的结果. 通常这是你想要的结果. 但是也有例外,考虑这个类: 1 public class Person{ 2 public int ID {get;set;} 3 public string Firstname

Entity Framework问题总结

Entity Framework之问题收集 Entity Framework之犹豫不决 Entity Framework之查询总结 Entity Framework之深入分析 目录导航

了解Entity Framework中事务处理

Entity Framework 6以前,框架本身并没有提供显式的事务处理方案,在EF6中提供了事务处理的API. 所有版本的EF,只要你调用SaveChanges方法进行插入.修改或删除,EF框架会自动将该操作进行事务包装.这种方法无法对事务进行显式的控制,例如新建事务等,可能会造成事务的粒度非常大,降低效率.EF不会对查询进行事务包装. 从EF6开始,默认情况下,如果每次调用Database.ExecuteSqlCommand(),如果其不在存在于任何事务中,则会将该Command包装到一个

Entity Framework中的连接管理

EF框架对数据库的连接提供了一系列的默认行为,通常情况下不需要我们太多的关注.但是,这种封装,降低了灵活性,有时我们需要对数据库连接加以控制. EF提供了两种方案控制数据库连接: 传递到Context的连接: Database.Connnection.Open(): 下面详解. 传递到Context的连接 EF6之前版本 有两个接受Connection的构造方法: public DbContext(DbConnection existingConnection, bool contextOwns