老赵的博客:http://blog.zhaojie.me/2008/02/using-translate-method-and-modify-command-text-before-query-in-linq-to-sql.html

http://www.csharpwin.com/dotnetspace/9639r2943_2.shtml

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(, 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, , 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 > )
totalPages++; if (pageIndex > totalPages)
{
pageIndex = totalPages;
}
if (pageIndex < )
{
pageIndex = ;
}
query.Skip((pageIndex - ) * 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();
} }

linq to sql 扩展方法的更多相关文章

  1. C#编程(六十一)------------LINQ中的扩展方法

    原文链接: http://blog.csdn.net/shanyongxu/article/details/47208401 LINQ中的扩展方法 LINQ中where扩展方法,要想使用,必须导入us ...

  2. Linq快速入门——扩展方法

    Linq为我们提供了许多扩展方法,方便我们对数据源进行操作(Where,Select...).即使你不了解算法,也能使用Linq当回牛人.扩展方法本质并不是什么高深的技术,说白了就是一个Static静 ...

  3. Linq 下的扩展方法太少了,您期待的 MoreLinq 来啦

    一:背景 1. 讲故事 前几天看同事在用 linq 给内存中的两个 model 做左连接,用过的朋友都知道,你一定少不了一个叫做 DefaultIfEmpty 函数,这玩意吧,本来很流畅的 from. ...

  4. Linq to sql 语法方法示例

    联表查询,判断追加条件,对集合分页 ) { var data = from m in _db.AppArticleComment join o in _db.AppArticle on m.Artic ...

  5. linq 的Distinct 扩展方法.

    List<miniclass> classs = new List<miniclass>(); classs.Add(new miniclass() { token = &qu ...

  6. LinQ—扩展方法

    概述 本节主要解说扩展方法,涉及LinQ的详细知识不多. 扩展方法的描写叙述 .net framework为编程人员提供了非常多的类,非常多的方法,可是,不论.net framework在类中为我们提 ...

  7. Linq扩展方法获取单个元素

    在使用Linq 提供的扩展方法时,First(OrDefault), Single(OrDefault), Last(OrDefault)都具有返回单个元素的功能.MSDN对这些方法的描述只有功能说明 ...

  8. Windows Phone本地数据库(SQLCE):2、LINQ to SQL(翻译)(转)

    首先.要说到的是,windows phone 7.1上基本的数据库功能是SQL Compact关于Mango的一个实现,使用linq to sql访问存储在数据库上的数据.   1.LINQ to S ...

  9. 从扩展方法到匿名方法再到LINQ

    1.首先我们应该知道什么是扩展方法: 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样 ...

随机推荐

  1. Git教程(5)常用技巧之本地分支

    http://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%AE%80%E4%BB%8B 基础 Git 研发组 ...

  2. 爬虫实现(hpricot)

    1.基本代码 在gemfile中加入gem "hpricot",bundler install之后,在application.rb中require "hpricot&qu ...

  3. poj3186 poj3267

    两道很不错的dp 3186很神似回文词,合并石子之类的问题: 一开始不知道怎么在dp方程中体现权值天数,很来才想起来 对于一段区间[i,j],里面的东西必然是要卖完的 又因为只能从两头开始卖,所以 d ...

  4. 异步加载DOM造成的高度问题造成iScroll不能滚动

    今天在使用iscroll4 做一个简单触屏滚动demo,发现上下拖动的时候总是会回弹,不能看到下面的内容.这个问题苦恼了很久,终于解决,下来就分享一下: 我的需求是这样的: 1.获取json数据app ...

  5. Google Maps API v2 Demo Tutorial

    申请API KEY https://code.google.com/apis/console/?noredirect 1. 创建项目,名称随意,只是为了区分 2. 开启Google Maps Andr ...

  6. golang资料整理 (整理 中...)

    网站guide 官方文档 国内镜像 安装go 之后,用godoc 来安装自己本地的文档服务器, godoc -http=:8080 打开浏览器 输入localhost:8080 就可以看到文档说明了. ...

  7. Oracle函数面试题

    1.对字符串操作的函数? 答:ASCII() –函数返回字符表达式最左端字符的ASCII 码值 CHR() –函数用于将ASCII 码转换为字符 –如果没有输入0 ~ 255 之间的ASCII 码值C ...

  8. HDU4578 Transformation 线段树

    这个题让我重新学习了加 乘 在区间的操作 题解:http://blog.csdn.net/guognib/article/details/25324025?utm_source=tuicool& ...

  9. e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (二) 图片验证码的识别

    上一篇文章讲了“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step 一 京东 商品搜索 ...

  10. 陈灯WGF双缓冲绘图框架

    “木丸子童屋”,专售各类儿童玩具,价格优惠,请大家多多支持:http://shop65552598.taobao.com/ WGF(windows graphic foundation)为window ...