zoukankan      html  css  js  c++  java
  • Linq多表查询条件批量删除

           前阵写了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));

    image

         例子没有从重写Linq或者扩展Linq表达式出发,因为从这里出发我能力估计还差一筹,呵呵还是我觉得没有必要,这样的实现是否更简单,实现的功能更多些,为何不重用人家MS的东西呢,个人观点而已


    作者:破  狼
    出处:http://www.cnblogs.com/whitewolf/
    本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼

  • 相关阅读:
    四种会话跟踪技术的对比
    【转载】.NET中使用Redis
    【转载】Windows平台下利用APM来做负载均衡方案
    【转载】Windows平台分布式架构实践
    MVC插件式开发平台
    如何用JS和HTML 做一个桌面炒股小插件【原创】
    如果用HTML5做一个在线视频聊天【原创】
    BraveOS正式版发布,希望大家下载使用
    短期将不再更新更多内容,见谅!
    打造自己的移动绿色版 Python 环境
  • 原文地址:https://www.cnblogs.com/whitewolf/p/1826624.html
Copyright © 2011-2022 走看看