Linq多表查询条件批量删除
2010-09-15 08:55 破狼 阅读(3398) 评论(1) 编辑 收藏 举报前阵写了Linq的单表生成相对Sql执行的批量删除,总觉得删除条件太局限了,并且又不能屏蔽linq的级联条件,这很容易误导一些人。所以想了应该还是要支持才好。呵呵。
其实思路和上次一样,就是生成Sql,用Linq自身条件组合sql应用,没有什么好说的。组合sql用 EXISTS关键字,组合一个子查询。
直接上Code:

/// </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的东西呢,个人观点而已
作者:破 狼
出处:http://www.cnblogs.com/whitewolf/
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客、博客园--破狼和51CTO--破狼。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架