我有一个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会被再次命中?
答案 0 :(得分:0)
如果您希望避免再次访问数据库,那么您可以试试这个;
var special = all.Where(c=>(c.X == 1) && (c.Y===1).ToList();
由于所有对象的列表已包含您想要的所有内容,您只需查询该列表,数据库就不会再被命中。
您的链接表达式只是一个查询,它只在您枚举数据时检索数据(例如调用.ToList())。您可以继续更改查询并暂停实际获取数据,直到您需要它为止。实体框架将在后台将您的查询转换为SQL查询,然后获取数据。
避免在每个查询结束时编写“ToList()”,因为这会强制EF命中数据库。
如果你曾经只打过数据库一次,那么通过调用“ToList(),To.Array等来获取你需要的数据,然后使用该集合(在你的情况下是”all“集合),因为这是持有所有数据的对象。