EF 6使用上下文进行缓存

时间:2016-05-15 12:12:46

标签: entity-framework

我有一个DbContext ..首先我做:

var all = context.MySet.Where(c=>c.X == 1).ToList();

以后(使用相同的上下文实例)

var special = context.MySet.Where(c=>(c.X == 1) && (c.Y===1).ToList();

数据库重启!由于第一个查询是有保证的  要返回第二个中存在的所有元素,为什么DB会被再次命中?

1 个答案:

答案 0 :(得分:0)

如果您希望避免再次访问数据库,那么您可以试试这个;

var special = all.Where(c=>(c.X == 1) && (c.Y===1).ToList();

由于所有对象的列表已包含您想要的所有内容,您只需查询该列表,数据库就不会再被命中。

您的链接表达式只是一个查询,它只在您枚举数据时检索数据(例如调用.ToList())。您可以继续更改查询并暂停实际获取数据,直到您需要它为止。实体框架将在后台将您的查询转换为SQL查询,然后获取数据。

避免在每个查询结束时编写“ToList()”,因为这会强制EF命中数据库。

如果你曾经只打过数据库一次,那么通过调用“ToList(),To.Array等来获取你需要的数据,然后使用该集合(在你的情况下是”all“集合),因为这是持有所有数据的对象。