sql-server – 实体框架高效查询
假设我有一个模子,文章有大量的列,数据库包括高出100,000行.假如我执行相同var articles = db.Articles.ToList()的操纵,它会检索数据库中每篇文章的整个文章模子并将其生涯在内存中吗? 因此,假如我添补一个只表现条目日期的表,而且它的问题是只有一种要领,只行使实体框架从数据库中检索这些列,它会更有用吗? 按照this,
看起来我应该行使NoTracking,由于数据没有被变动或删除,只表现.以是我的查询此刻酿成var articles = db.Articles.AsNoTracking().ToList().我还应该做些什么来进步服从吗? 我的另一个题目是,按照this answer,行使.Contains(…)在处理赏罚大型数据库时会导致机能降落.搜刮大型数据库中的条目标保举要领是什么? 办理要领它被称为投影,只是转换为SQL中的SELECT column1,column2,…:var result = db.Articles .Select(a => new { Date = a.Date,Title = a.Title }) .ToList(); 而不是=> new {…}(建设“匿名”工具列表)您还可以行使定名帮助类(或“视图模子”):a =>新的MyViewModel {…}仅包括所选属性(但您不能将=>新文章{…}用作实体自己). 对付这样的投影,您不必要AsNoTracking(),由于无论怎样都不跟踪投影数据,只跟踪完备的实体工具. 而不是行使Contains更常见的方法是行使Where like: var date = DateTime.Now.AddYears(-1); var result = db.Articles .Where(a => date <= a.Date) .Select(a => new { Date = a.Date,Title = a.Title }) .ToList(); 这将仅选择不高出一年的文章. Where方才被转换为SQL WHERE语句,而且过滤器在数据库中执行(与SQL查询一样快,详细取决于表巨细和正确的索引等).只有此过滤器的功效才会加载到内存中. 编辑 请参阅下面的评述: 不要将IEnumerable< T> .Contains(T t)与string.Contains(string subString)夹杂.您在题目中链接的谜底是关于Contains的第一个版本.假如要搜刮文本正文中包括字符串“keyword”的文章,则必要第二个包括版本: string keyword = "Entity Framework"; var result = db.Articles .Where(a => a.Body.Contains(keyword)) .Select(a => new { Date = a.Date,Title = a.Title }) .ToList(); 这将转化为相同于SQL中的NERE%Entity Framework%’的WHERE Body.关于Contains机能不佳的谜底基础不合用于此版本的Contains. (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |