【发布时间】:2019-07-25 14:12:58
【问题描述】:
我想知道如何使用 EF6 从 SQL Server 流式传输数据。
假设有这些类
- 人员存储库
- EFPerson(EF 型号)
- DomainPerson(域模型)
- PersonUsingClass
假设 PersonUsingClass 依赖于获取一堆 DomainPersons。 假设业务规则规定不允许 EFPerson 离开 PersonRepository。
通常我会有一个如下所示的存储库方法:
public IEnumerable<DomainPerson> GetPeople()
{
using (var db = new efContext())
{
IQueryable efPeople = db.Person.Where(someCriteria);
foreach (var person in efPeople)
{
yield return person.ToDomainPerson();
}
}
}
使用我这里的代码,所有内容都会在执行 foreach 时加载到内存中。我可以通过将 IQueryable 返回给 PersonUsingClass 来实现流式传输,但这会将 EF 模型暴露给该类,这是不受欢迎的场景。
真的不可能隐藏 EF 模型,为什么同时流式传输数据?还是有什么我不知道的?
【问题讨论】:
-
在该方法中没有记录被加载到内存中(除非 EF 在内部进行一些缓存)。如果您
foreach覆盖该方法的结果,那么您将逐条迭代每条记录。如果您对该方法的结果调用 .ToList(), ToArray(),则记录将被加载到内存中。 -
太棒了!一位团队成员让我确信我错了,因为我们可以通过这种方式传输数据。您可以在线找到 EF 的文档,其中指出“LINQ 查询总是在迭代查询变量时执行,而不是在创建查询变量时执行”。所以最后我们认为,一旦 foreach 被命中,所有东西都会被加载到内存中,然后这个 yield return 不会有任何有意义的效果,除了推迟映射“ToDomainPerson”。请创建您的评论作为答案,然后我可以接受。
标签: c# entity-framework-6