引擎盖下的实体框架

时间:2017-06-29 18:26:01

标签: c# entity-framework

我有一些使用Entity Framework的遗留代码。

当我调试代码时,我可以看到EF DbContext包含整个表。它由OData传递到前端,然后进行角度处理。

所以我试图搜索,EF只能获得一条记录吗?

我到处都看到SingleOrDefault方法或其他IQueryable,但据我所知,这些是collections的一部分。

Microsoft说:如果集合不包含任何元素,有时默认值(TSource)不是您要使用的默认值。

这是否意味着EF总是从表中获取所有数据,我可以在以后使用它们?

或者有没有办法强制内部查询只获得一行,只有一行?

我们正在使用postgresql。

2 个答案:

答案 0 :(得分:1)

不,如果正确使用 ,EF将不会将整个表格选入内存。通过正确;我的意思是:

context.Table.First();

将转换为仅返回一行的SQL查询,然后映射到要返回到调用代码的对象。这是因为上面的代码使用LINQ-to-Entities。如果你做了类似的事情:

context.Table.ToList().First();

然后选择整个表以使ToList工作,LINQ-to-Objects处理First。因此,只要您使用延迟枚举进行查询(未提前获得结果),您就可以了。

答案 1 :(得分:1)

使用Entity Framework,您可以使用LINQ来运行查询并获取单个记录或有限集。但是,在.NET项目中,控制器应该在将结果返回给客户端应用程序之前解析OData查询参数并过滤数据集。请根据this tutorial检查您的控制器代码,看看您是否遗漏了某些内容。

如果您以某种方式绕过内置的OData框架,那么可能有助于了解哪些查询立即执行而哪些查询延迟执行。请参阅this list以确切了解哪些操作将强制访问数据库,并尝试在尽可能晚的情况下立即执行任何操作。