前阵写了Linq的单表生成相对Sql执行的批量删除,总觉得删除条件太局限了,并且又不能屏蔽linq的级联条件,这很容易误导一些人。所以想了应该还是要支持才好。呵呵。
其实思路和上次一样,就是生成Sql,用Linq自身条件组合sql应用,没有什么好说的。组合sql用 EXISTS关键字,组合一个子查询。
DELETE FROM [TableName] WHERE EXISTS(select ..from [TableName] where query );
直接上Code:
- 代码
- /// EXISTS
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="source"></param>
- /// <param name="query"></param>
- /// <returns></returns>
- public static int Delete<T>(this System.Data.Linq.Table<T> source, Expression<Func<T, bool>> query)
- where T : class
- {
- if (source == null)
- throw new ArgumentException("source");
- if (query == null)
- throw new ArgumentException("query");
- //query = t => true;
- //为空DELETE FROM [dbo].[test] 全删除;个人觉得为空全删除,很不人道,所以还是抛异常
- System.Data.Linq.DataContext db = source.Context;
- DbCommand cmd= db.GetCommand(source.Where(query));
- string queryStr = cmd.CommandText;
- string sql = "DELETE FROM " + source.Context.Mapping.GetTable(typeof(T)).TableName + " WHERE EXISTS(" + queryStr+")";
- List<object> dbparams = new List<object>();
- foreach (SqlParameter item in cmd.Parameters)
- {
- SqlParameter p = new SqlParameter(item.ParameterName, item.SqlDbType, item.Size);
- p.Value = item.Value;
- dbparams.Add(item.Value);
- }
- cmd = null;
- return db.ExecuteCommand(sql, dbparams.ToArray());
- }
- 复制代码
调用方式就很简单了,一个Lamdam表达式,就搞定。比如
Console.Write( DataContext.test.Delete(t => t.id != null||t.name.Contains("qq")&&t.Orders.OrderDate<=DateTime.Now));
例子没有从重写Linq或者扩展Linq表达式出发,因为从这里出发我能力估计还差一筹,呵呵还是我觉得没有必要,这样的实现是否更简单,实现的功能更多些,为何不重用人家MS的东西呢,个人观点而已。
本文转自 破狼 51CTO博客,原文链接:http://blog.51cto.com/whitewolfblog/834738,如需转载请自行联系原作者