【发布时间】:2012-07-21 12:06:08
【问题描述】:
假设我有一个模型,Article,它有大量的列并且数据库包含超过 100,000 行。如果我执行var articles = db.Articles.ToList() 之类的操作,它会为数据库中的每篇文章检索整个文章模型并将其保存在内存中,对吗?
因此,如果我正在填充一个仅显示条目日期及其标题的表,是否有一种方法可以仅使用实体框架从数据库中仅检索这些列,它会是效率更高?
根据this,
在对象中跟踪返回的对象需要成本 语境。检测对象的变化并确保多个 对相同逻辑实体的请求返回相同的对象实例 要求将对象附加到 ObjectContext 实例。如果你 不打算对对象进行更新或删除,并且不需要 身份管理时,请考虑使用 NoTracking 合并选项 你执行查询。
看起来我应该使用NoTracking,因为数据没有被更改或删除,只是显示。所以我的查询现在变成了var articles = db.Articles.AsNoTracking().ToList()。我还应该做些什么来提高效率吗?
我的另一个问题是,根据this answer,使用.Contains(...) 在处理大型数据库时会导致性能大幅下降。用于搜索大型数据库中的条目的推荐方法是什么?
【问题讨论】:
-
顺便说一句:
Contains并不慢,因为数据库表很大。Contains询问:“给我具有 PropertyXValue = 1 OR PropertyXValue = 5 OR PropertyXValue = 7 等的实体。”Contains如果收集这些“OR 值”会很慢“你要求的很大。那么对于一张小桌子,即使是一张空桌子,它也很慢。
标签: sql-server entity-framework linq-to-sql