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. (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |