使用EF 6与C#查询Scientists、Countries关联表数据的简单方法
EF6 关联数据查询解决方案
EF6本身就内置了无需手动编写JOIN语句的关联数据加载能力,你当前遇到的Country属性为空的问题,是因为没有主动触发关联导航属性的加载,以下是两种最简实现方案:
方案1:预先加载(Eager Loading,推荐优先使用)
该方案会让EF在单次查询中自动生成JOIN语句拉取两张表的所有关联数据,没有额外查询开销,适合你明确需要使用Country关联信息的场景。
- 首先引入对应命名空间:
using System.Data.Entity;
- 修改查询代码即可:
List<Scientist> scients = ctx.Scientists .Include(s => s.Country) // 指定需要同步加载关联的Country实体 .ToList();
执行后返回的所有Scientist实例的Country属性会自动填充,直接访问Country.CountryName即可拿到对应数据。如果你不想用强类型重载,也可以替换为.Include("Country"),但强类型版本支持编译期错误校验,更推荐使用。
方案2:懒加载(Lazy Loading,适合不确定是否需要关联数据的场景)
如果你没有主动修改EF6的默认配置,你原本的写法也可以拿到关联数据,该机制会在你第一次访问Scientist.Country属性时自动发送SQL查询对应Country数据:
- 默认满足的前提条件:
- 导航属性已标记为
virtual(你的代码中已经符合要求) ctx.Configuration.LazyLoadingEnabled = true(EF6默认开启)ctx.Configuration.ProxyCreationEnabled = true(EF6默认开启)
- 导航属性已标记为
- 注意:该方案存在N+1查询问题,如果你需要遍历所有科学家的Country属性,会额外产生N次单独的Countries表查询,数据量大时性能很差,仅适合偶尔访问关联数据的场景。
内容的提问来源于stack exchange,提问作者Cholas
相关产品推荐
相关产品推荐

