因此,如果我填充一个只显示条目日期的表,并且它的标题是只有一种方法,只使用实体框架从数据库中检索这些列,它会更有效吗?
根据this,
There is a cost required to track returned objects in the object
context. Detecting changes to objects and ensuring that multiple
requests for the same logical entity return the same object instance
requires that objects be attached to an ObjectContext instance. If you
do not plan to make updates or deletes to objects and do not require
identity management,consider using the NoTracking merge options when
you execute queries.
看起来我应该使用NoTracking,因为数据没有被更改或删除,只显示.所以我的查询现在变成var articles = db.Articles.AsNoTracking().ToList().我还应该做些什么来提高效率吗?
我的另一个问题是,根据this answer,使用.Contains(…)在处理大型数据库时会导致性能下降.搜索大型数据库中的条目的推荐方法是什么?
解决方法
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.