zoukankan      html  css  js  c++  java
  • Linq 数据加载与缓存

    以下的描述都是同一个DataContext

     

    1.通过提前检索数据提高循环查询的性能

    原因:如果数据已经在DataContext中加载过,使用外键关系的对象将不会访问数据。

                var db = App.DB;
                db.Log = Console.Out;
                db.GetTable<HR_Employee>().ToArray();
                var list = db.GetTable<HR_PayEmployee>().Take(20).ToList();
                foreach (var item in list)
                {
                    var a = item.HR_Employee;
                }

    如果将红色部分注释掉,紫色部分的代码,每执行一次将访问一边数据库。

    2.通过LoadWith加载子表信息(具体参看MSDN)。

                    var db = App.DB;
                    db.Log = Console.Out;
                    DataLoadOptions options = new DataLoadOptions();
                    options.LoadWith<HR_PayEmployee>(p => p.HR_PayRecord);
                    db.LoadOptions = options;
                    //db.GetTable<HR_PayRecord>().ToList();
                    //var list = db.GetTable<HR_PayEmployee>().Take(3).ToList();
                    var list = db.GetTable<HR_PayEmployee>().ToList();
                    foreach (var item in list)
                    {
                        var a = item.HR_PayRecord[0].Amount;
                    }

    不用LoadWith:不论是否执行加载红色部分的对象,紫色部分每次循环都会访问数据库。
    用了LoadWith:紫色部分每次循环都不会访问数据库。

    注意:如果第一次访问是通过 db.GetTable<HR_PayEmployee>().Take(3).ToList()进行访问,则不论是否LoadWith都会访问数据库,如果提前通过其他方式ToList过,则再次使用Take后对子对象的访问将不会访问数据。


    如果LoadWith中写入过多的对象,将大大降低性能,所以需要根据情况选择不用的加载方式来提高Linq的查询性能。

  • 相关阅读:
    webStorm 快捷键 + 浏览器
    Linux安装nodejs和npm
    jQuery页面滚动底部加载数据
    html跳转指定位置-利用锚点
    JavaScript自定义对象
    vue v-time指令封装(接口返回时间戳 在到日期转换)
    vue 之 引入elementUI(两步走)
    小白6步搞定vue脚手架创建项目
    vue 封装组件
    npm dev run 报错
  • 原文地址:https://www.cnblogs.com/rock_chen/p/1857712.html
Copyright © 2011-2022 走看看