linq to sql 扩展方法

1、DataContext扩展方法
public static class DataContextExentions
    {
        /// <summary>
        /// 打开连接
        /// </summary>
        /// <param name="dataContext"></param>
        private static void OpenConnection(this DataContext dataContext)
        {
            if (dataContext.Connection.State == ConnectionState.Closed)
            {
                dataContext.Connection.Open();
            }
        }


        /// <summary>
        /// 扩展ExecuteQuery方法 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dataContext"></param>
        /// <param name="query"></param>
        /// <param name="withNoLock"></param>
        /// <returns></returns>
        public static List<T> ExecuteQuery<T>(this DataContext dataContext, IQueryable query, bool withNoLock)
        {
            DbCommand command = dataContext.GetCommand(query, withNoLock);

            dataContext.OpenConnection();

            using (DbDataReader reader = command.ExecuteReader())
            {
                return dataContext.Translate<T>(reader).ToList();
            }
        }


        /// <summary>
        /// 扩展ExecuteQuery方法2
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dataContext"></param>
        /// <param name="query"></param>
        /// <param name="withNoLock"></param>
        /// <returns></returns>
        public static List<T> ExecuteQuery<T>(this DataContext dataContext, IQueryable query)
        {
            DbCommand command = dataContext.GetCommand(query);
            dataContext.OpenConnection();

            using (DbDataReader reader = command.ExecuteReader())
            {
                return dataContext.Translate<T>(reader).ToList();
            }
        }

        /// <summary>
        /// 扩展GetCommend方法,允许设置WithNoLick
        /// </summary>
        /// <param name="dataContext"></param>
        /// <param name="query"></param>
        /// <param name="withNoLock"></param>
        /// <returns></returns>
        private static SqlCommand GetCommand(this DataContext dataContext, IQueryable query, bool withNoLock)
        {
            SqlCommand command = (SqlCommand)dataContext.GetCommand(query);

            if (withNoLock)
            {
                command.CommandText = AddWithNoLock(command.CommandText);
            }

            return command;
        }

        /// <summary>
        /// 将Sql语句修改为with nolock
        /// </summary>
        /// <param name="cmdText"></param>
        /// <returns></returns>
        private static string AddWithNoLock(string cmdText)
        {
            IEnumerable<Match> matches =
                s_withNoLockRegex.Matches(cmdText).Cast<Match>()
                .OrderByDescending(m => m.Index);
            foreach (Match m in matches)
            {
                int splitIndex = m.Index + m.Value.Length;
                cmdText =
                    cmdText.Substring(0, splitIndex) + " WITH (NOLOCK)" +
                    cmdText.Substring(splitIndex);
            }

            return cmdText;
        }

        private static Regex s_withNoLockRegex =  new Regex(@"(] AS [td+])", RegexOptions.Compiled);
    }
}
2、DataContext扩展方法支持分页
/// <summary>
/// DataContext扩展方法
/// </summary>
public static class DataContextExtends
{
    /// <summary>
    /// ExecuteQuery方法扩展,将对象以redader方式转换为实体
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="dataContext"></param>
    /// <param name="query"></param>
    /// <returns></returns>
    public static List<T> ExecuteQuery<T>(this DataContext dataContext, IQueryable<object> query)
    {
        return ExecuteQuery<T>(dataContext, query, 1, query.Cast<T>().Count());
    }

    /// <summary>
    /// ExecuteQuery方法扩展,代表分页的
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="dataContext"></param>
    /// <param name="query"></param>
    /// <param name="pageIndex"></param>
    /// <param name="pageSize"></param>
    /// <returns></returns>
    public static List<T> ExecuteQuery<T>(this DataContext dataContext, IQueryable<object> query, int pageIndex, int pageSize)
    {
        int total = query.Count();
        int totalPages = total / pageSize;

        if (total % pageSize > 0)
            totalPages++;

        if (pageIndex > totalPages)
        {
            pageIndex = totalPages;
        }
        if (pageIndex < 1)
        {
            pageIndex = 1;
        }
        query.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
        DbCommand command = dataContext.GetCommand(query);
        dataContext.OpenConnection();
        using (DbDataReader reader = command.ExecuteReader())
        {
            return dataContext.Translate<T>(reader).ToList();
        }
    }
    private static void OpenConnection(this DataContext dataContext)
    {
        if (dataContext.Connection.State == ConnectionState.Closed)
            dataContext.Connection.Open();
    }

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏更流畅、简洁的软件开发方式

【开源】QuickPager ASP.NET2.0分页控件V2.0.0.1——分页控件的源码 (二)

namespace JYK.Controls.PageManage {     /**//// <summary>     /// 生成分页控件需要的SQL语句...

2166
来自专栏C#

将文本文件的内容存储在DataSet中的方法总结

    项目中比较多的会对文件进行操作,例如文件的上传下载,文件的压缩和解压等IO操作。在.NET项目中较多的会使用DataSet,DataTable进行...

1968
来自专栏王磊的博客

Net连接mysql的公共Helper类MySqlHelper.cs带MySql.Data.dll下载

MySqlHelper.cs代码如下: using System; using System.Collections.Generic; using System...

5309
来自专栏技术博客

字符串"2013/5/18 0:00:00”不是有效的 AllXsd 值

可以看到上述日期字符串当中18后面存在一个空格,就是这个空格导致的不是一个有效的AllXsd值。想让此字符串日期转换为有效的格式,可以用T来替换掉18后面的空格...

1543
来自专栏跟着阿笨一起玩NET

Linq 分组(group by)求和(sum)并且按照分隔符(join)分割列数据

转载:http://www.cnblogs.com/zq281660880/archive/2012/09/26/2704836.html

2792
来自专栏c#开发者

让web api 4.5支持Jquery.getJson(url,handle)跨域访问

代码片段,google了半天,找到的都是4.5 rc,或之前版本的代码,发现都不能用,正式版后有些方法做了修改。我重新修改一下分享给大家 public stat...

2755
来自专栏草根专栏

.NET Core 网络数据采集 -- 使用AngleSharp做html解析

3520
来自专栏yl 成长笔记

从数据库中下载文件的工具

832
来自专栏大内老A

以上下文(Context)的形式创建一个共享数据的容器

在很多情况下我们具有这样的需求:为一组相关的操作创建一个执行上下文并提供一个共享的数据容器,而不是简单地定义一个全局变量,或者将数据通过参数传来传去。这样的上下...

2015
来自专栏菩提树下的杨过

C#:DataTable映射成Model

这是数据库开发中经常遇到的问题,当然,这可以用现成的ORM框架来解决,但有些时候,如果DataSet/DataTable是第三方接口返回的,ORM就不方便了,还...

21610

扫码关注云+社区