zoukankan      html  css  js  c++  java
  • LinqtoSQL性能优化提升实践

    Linq-to-SQL的性能优化,根据我的个人实践和效果降序排列,如下:

    1. 预编译 CompiledQuery (如果执行次数不止一次的话)

    /// <summary>
    /// Utility class to store compiled queries
    /// </summary>
    public static class QueriesUtility
    {
      /// <summary>
      
    /// Gets the query that returns categories with more than five products.
      
    /// </summary>
      
    /// <value>The query containing categories with more than five products.</value>
      public static Func<NorthwindDataContext, int, IEnumerable<Category>>
        GetCategoriesWithMoreThanFiveProducts
        {
          get
          {
            Func<NorthwindDataContext, IEnumerable<Category>> func =
              CompiledQuery.Compile<NorthwindDataContext,  int, IEnumerable<Category>>
              ((NorthwindDataContext context, int count) => context.Categories.
                Where<Category>(cat => cat.Products.Count > count));
            return func;
          }
        }
    }

    调用:

    using (NorthwindDataContext context = new NorthwindDataContext())
    {
      QueriesUtility.GetCategoriesWithMoreThanFiveProducts(context, 5);
    }

    2. 缓存MappingSource

    把默认的DataContext用自己的代替,代码如下:

    using System;
    using System.Data;
    using System.Data.Linq;
    using System.Data.Linq.Mapping;

    namespace My.Company.Depart
    {
        public class MyDataContext : DataContext
        {
            /// <summary>
            
    /// Thread-safe
            
    /// Cached MappingSource
            
    /// </summary>
            private static MappingSource _cachedMappingSource = new AttributeMappingSource(); /* Thread-safe */
            
            public MyDataContext(IDbConnection cx)
                : base(cx, _cachedMappingSource)
            {
            }
                    
            public MyDataContext(string cx, bool ojectTrackingEnabled = truebool consoleLogging = false)
                : base(cx, _cachedMappingSource)
            {
                this.ObjectTrackingEnabled = ojectTrackingEnabled;

                if (consoleLogging)
                    this.Log = Console.Out;
            }

            public Table<MyTable> MyTable
            {
                get { return this.GetTable<MyTable>(); }
            }

            //blah. blah, blah......
        }
    }

    然后这样调用:

    using (var dataContext = new MyDataContext(ConnectionStringProvider.GetDefault()))
    {
      var list = dataContext.MyTable.Where(t => t.ID > 5).ToList();
      //blah. blah, blah......
    }

    3. 查询的时候关闭ObjectTrackingEnabled

    dataContext.ObjectTrackingEnabled = false;

    关于ObjectTrackingEnabled更详细的解释查看这个页面。

    4. 关联表查询的时候用 LoadOptions

    关于Load,LoadWith,AssociateWith查看这个页面

    5. 其它参考资料

  • 相关阅读:
    正则表达式全部符号解释
    如何在开机启动时自动打开小键盘灯
    SQL SERver2005中row_number() 的用法
    用命令打开控制面板的各项
    SQL Server 2008 对 TSQL 语言的增强
    SQL2000DBCC DBREINDEX重建索引提高SQL Server性能
    Sql Server 中常用的字符串函数
    coalesce的用法
    word to PD R qm addin 运行时错误‘91’
    Windows系统:开始–运行–命令大全
  • 原文地址:https://www.cnblogs.com/Mainz/p/2784722.html
Copyright © 2011-2022 走看看