通用Linq增删改查操作

通用Linq增删改查操作,查有些条件限制,复杂查询用动态linq或linq执行sql语句。

    using System.Linq.Expressions;
    using DataModels;
    using PubOptions;
    public class CommonLinqService
    {
        private LinqDataContext db = null;
        public CommonLinqService()
        {
            db = new LinqDataContext();
        }
        #region 通用Linq操作
        #region 通用的lamuda表达式获取查询数据源返回List泛型
        / <summary>
        /  通用的lamuda表达式获取查询数据源返回List泛型
        / </summary>
        public List<T> GetSearchDataSource<T>(Func<T, bool> WhereExpression, Func<T, object> OrderByExpression, int CurrentPageIndex, int PageSize, out int RecordCount) where T : class
        {
            try
            {
                var entity = db.GetTable<T>().Where(WhereExpression).OrderBy(OrderByExpression);
                RecordCount = entity.Count();
                return entity.Skip(CurrentPageIndex * PageSize).Take(PageSize).ToList();
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        #endregion
        #region 通用的lamuda表达式获取单条数据
        / <summary>
        /  通用的lamuda表达式单条数据
        / </summary>
        public T GetEntity<T>(Expression<Func<T, bool>> expression) where T : class
        {
            try
            {
                return db.GetTable<T>().SingleOrDefault(expression);
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        #endregion
        #region 通用的lamuda表达式获取所有数据返回List泛型
        /// <summary>
        /// 通用的lamuda表达式获取所有数据返回List泛型
        /// </summary>
        public List<T> GetEntityList<T>(Expression<Func<T, bool>> expression) where T : class
        {
            try
            {
                return db.GetTable<T>().Where(expression).ToList<T>();
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        #endregion
        #region 通用的lamuda表达式判断是否存在记录
        / <summary>
        /  通用的lamuda表达式判断是否存在记录
        / </summary>
        public bool IsExitsData<T>(Expression<Func<T, bool>> expression) where T : class
        {
            bool result = true;
            try
            {
                T entity = db.GetTable<T>().SingleOrDefault(expression);
                if (entity == null)
                {
                    result = false;
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
            return result;
        }
        #endregion
        #region 通用的lamuda表达式新增实体操作
        / <summary>
        /  通用的lamuda表达式新增实体操作
        / </summary>
        public bool AddEntity<T>(T entity) where T : class
        {
            bool result = false;
            try
            {
                db.GetTable<T>().InsertOnSubmit(entity);
                db.SubmitChanges();
                result = true;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
            return result;
        }
        #endregion
        #region 通用的lamuda表达式删除实体操作
        / <summary>
        /  通用的lamuda表达式删除实体操作[批量删除(string[] array = (string[])KeyIds.ToArray(typeof(string));expression = T => array.Contains(T.KeyId));)]
        / </summary>
        public bool DeleteEntity<T>(Expression<Func<T, bool>> expression) where T : class
        {
            bool result = false;
            try
            {
                var entity = db.GetTable<T>().Where(expression);
                if (entity != null)
                {
                    db.GetTable<T>().DeleteAllOnSubmit(entity);
                    db.SubmitChanges();
                    result = true;
                }
                else
                {
                    result = false;
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
            return result;
        }
        #endregion
        #region 通用的lamuda表达式和反射机制更新实体操作
        / <summary>
        /  通用的lamuda表达式和反射机制更新实体操作(批量更新expression = T => KeyIDs.Contains(T.KeyId))
        / </summary>
        public bool UpdateEntity<T>(List<T> entity, Expression<Func<T, bool>> expression) where T : class
        {
            bool result = false;
            try
            {
                int i = 0;
                var list = db.GetTable<T>().Where(expression).ToList<T>();
                //下面用到循环,是为了能批量更新
                for (; i < list.Count(); i++)
                {
                    if (list[i] != null)
                    {
                        Dynamic.SetObject(entity[i],list[i]);
                    }
                    else
                    {
                        break;
                    }
                }
                if (i == list.Count())
                {
                    db.SubmitChanges();
                    result = true;
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
            return result;
        }
        #endregion
        #endregion
    }

    /// <summary>
    /// 对象属性或字段动态操作类
    /// </summary>
    public class Dynamic
    {
        /// <summary>
        /// 获取对象属性或字段名
        /// </summary>
        /// <param name="obj">对象</param>
        /// <returns></returns>
        public static List<string> GetNames(object obj)
        {
            List<string> names = new List<string>();
            Type type = obj.GetType();
            System.Reflection.PropertyInfo[] pis = type.GetProperties(
                System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
            System.Reflection.FieldInfo[] fis = type.GetFields(
                System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
            foreach (System.Reflection.PropertyInfo pi in pis)
                names.Add(pi.Name);
            foreach (System.Reflection.FieldInfo fi in fis)
            {
                if (names.IndexOf(fi.Name) == -1)
                    names.Add(fi.Name);
            }
            return names;
        }

        /// <summary>
        /// 获取对象属性或字段的值
        /// </summary>
        /// <param name="obj">要获取值的对象</param>
        /// <param name="name">对象属性或字段名,区分大小写</param>
        /// <returns></returns>
        public static object GetValue(object obj, string name)
        {
            object value = GetPropertyValue(obj, name);
            if (value == null)
                value = GetFieldValue(obj, name);
            return value;
        }

        /// <summary>
        /// 动态给对象属性或字段赋值
        /// </summary>
        /// <param name="obj">要赋值的对象</param>
        /// <param name="name">对象属性或字段名,区分大小写</param>
        /// <param name="value">对象属性或字段要赋的值</param>
        /// <param name="isUpperLower">是否区分大小写,true 区分,false 不区分</param>
        /// <returns></returns>
        public static object SetValue(object obj, string name, object value)
        {
            SetPropertyValue(obj, name, value);
            SetFieldValue(obj, name, value);
            return obj;
        }

        /// <summary>
        /// 动态给对象赋值(把源赋给目标)
        /// </summary>
        /// <param name="source">源对象</param>
        /// <param name="destination">目标对象</param>       
        public static void SetObject(object source, object destination)
        {
            //动态给note对象赋值
            List<String> list = GetNames(source); //获取result的属性名
            //获取result每一个属性值,并赋给un对象对应的属性
            foreach (var name in list)
            {
                object obj = GetValue(source, name);
                if (obj != null)
                {
                    SetValue(destination, name, obj);
                }
            }
        } 
    } 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CSICSICSICSI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值