在实现LINQ to SQL删除时可以使用Lambda Expression批量删除数据那么在解析表达式过程中生成Where Condition会有大量的代码生成,那么这里向你做一点简单的总结,算是一点体会吧,希望对你有所帮助。
在樊城等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站设计、成都做网站 网站设计制作按需求定制网站,公司网站建设,企业网站建设,高端网站设计,成都全网营销推广,外贸营销网站建设,樊城网站建设费用合理。
根据LINQ to Sql原有的设计,解析Query得到DbCommand应该是SqlProvider干的事,只是现在这个SqlProvider只从IReaderProvider出(事实上MS也没设计个IUpdateProvider或者IDeleteProvider来着),所以也只对SELECT感冒。搞的咱们只能在DataContext里自力更生了。
LINQ to SQL删除实现的实例:
不过既然已经有了可以生成SELECT的IReaderProvider,稍微把SELECT语句改造一下不就能得到DELETE了吗!基本思路:
- public static int DeleteAll﹤TEntity﹥(
- this Table﹤TEntity﹥ table,
- Expression﹤Func﹤TEntity, bool﹥﹥ predicate)
- where TEntity : class
- {
- IQueryable query = table.Where(predicate);
- DbCommand com = dc.GetCommand(query);
- //TODO:改造sql语句
- return com.ExecuteNonQuery();
- }
- }
这里直接拿直接拿where生成的query来GetCommand,得到的sql语句大致如下:
- SELECT fields... FROM tableName AS TableAlias WHERE Condition
LINQ to SQL删除的目标:
- DELETE FROM tableName WHERE Condition
可见关键是得到tableName,用正则是***。不过这里还有一个缺陷就是只能用expression来做删除不能用linq query,比如我想这样:
- var query = from item in context.Items
- where item.Name.StartsWith("XX")
- select item;
- context.DeleteAll(query);
看来要把DeleteAll放到DataContext里,不过这样有风险,有可能会接受到无法转换的SELECT语句,增加判断必不可少。
LINQ to SQL删除最终完成如下:
- public static class DataContextEx
- {
- public static int DeleteAll(
- this DataContext dc, IQueryable query)
- {
- DbCommand com = dc.GetCommand(query);
- Regex reg = new Regex("^SELECT[\\s]*(?﹤Fields﹥.*)
- [\\s]*FROM[\\s]*(?﹤Table﹥.*)[\\s]*AS[\\s]*
- (?﹤TableAlias﹥.*)[\\s]*WHERE[\\s]*(?﹤Condition﹥.*)",
- RegexOptions.IgnoreCase);
- Match match = reg.Match(com.CommandText);
- if (!match.Success)
- throw new ArgumentException(
- "Cannot delete this type of collection");
- string table = match.Groups["Table"].Value.Trim();
- string tableAlias = match.Groups["TableAlias"].Value.Trim();
- string condition = match.Groups["Condition"].
- Value.Trim().Replace(tableAlias, table);
- com.CommandText = string.Format(
- "DELETE FROM {0} WHERE {1}", table, condition);
- if (com.Connection.State != System.Data.ConnectionState.Open)
- com.Connection.Open();
- return com.ExecuteNonQuery();
- }
- public static int DeleteAll﹤TEntity﹥(
- this Table﹤TEntity﹥ table, Expression﹤Func﹤TEntity, bool﹥﹥ predicate)
- where TEntity : class
- {
- IQueryable query = table.Where(predicate);
- return table.Context.DeleteAll(query);
- }
- }
注:reg表达式取自MSDN Forum
原文来自博客园:http://www.cnblogs.com/jackielin/archive/2008/03/07/1095602.html
LINQ to SQL删除的实现过程中的一点体会就向你介绍到这里,希望对你了解和学习LINQ to SQL删除有所帮助。
文章题目:LINQtoSQL删除实现体会小结
转载源于:http://www.shufengxianlan.com/qtweb/news28/264578.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联