我有一些使用Entity Framework的遗留代码。
当我调试代码时,我可以看到EF DbContext包含整个表。它由OData传递到前端,然后进行角度处理。
所以我试图搜索,EF只能获得一条记录吗?
我到处都看到SingleOrDefault
方法或其他IQueryable,但据我所知,这些是collections
的一部分。
Microsoft说:如果集合不包含任何元素,有时默认值(TSource)不是您要使用的默认值。
这是否意味着EF总是从表中获取所有数据,我可以在以后使用它们?
或者有没有办法强制内部查询只获得一行,只有一行?
我们正在使用postgresql。
答案 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以确切了解哪些操作将强制访问数据库,并尝试在尽可能晚的情况下立即执行任何操作。