sql-server – 实体框架高效查询

前端之家收集整理的这篇文章主要介绍了sql-server – 实体框架高效查询前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有一个模型,文章有大量的列,数据库包含超过100,000行.如果我执行类似var articles = db.Articles.ToList()的操作,它会检索数据库中每篇文章的整个文章模型并将其保存在内存中吗?

因此,如果我填充一个只显示条目日期的表,并且它的标题是只有一种方法,只使用实体框架从数据库中检索这些列,它会更有效吗?

根据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(…)在处理大型数据库时会导致性能下降.搜索大型数据库中的条目的推荐方法是什么?

解决方法

它被称为投影,只是转换为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.

猜你在找的MsSQL相关文章