加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

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

发布时间:2021-03-22 13:22:12 所属栏目:编程 来源:网络整理
导读:假设我有一个模子,文章有大量的列,数据库包括高出100,000行.假如我执行相同var articles = db.Articles.ToList()的操纵,它会检索数据库中每篇文章的整个文章模子并将其生涯在内存中吗? 因此,假如我添补一个只表现条目日期的表,而且它的问题是只有一种要领,只

假设我有一个模子,文章有大量的列,数据库包括高出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.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读