基于Hi博客的类库 20160811

using Model;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Runtime.Remoting.Messaging;
using System.Text; namespace Comm
{
public class Base<T> where T : class
{
//更改为存线程内
MyContext db = dbEntities; //;// = new Model.qds114576568_dbEntities();
private static MyContext dbEntities
{
get
{
DbContext dbContext = CallContext.GetData(typeof(Base<T>).Name) as DbContext;
if (dbContext == null)
{
dbContext = new MyContext();
//dbContext.Configuration.ValidateOnSaveEnabled = false;
//将新创建的 ef上下文对象 存入线程
CallContext.SetData(typeof(Base<T>).Name, dbContext);
}
return dbContext as MyContext;
}
} #region 1.0添加数据 + Add(Tclass model)
/// <summary>
/// 1.0添加数据
/// </summary>
/// <param name="model"></param>
public void Add(T model)
{
db.Set<T>().Add(model);
}
#endregion #region 2.0 删除方法1 删除给定的对象 +Del(Tclass model)
/// <summary>
/// 2.0 删除方法1 删除给定的对象
/// </summary>
/// <param name="model"></param>
/// <param name="IsSoftDel">是否软删除[*如果是软删除 则自动保存*]</param>
/// <param name="Pro">软删除 要修改的删除标志字段</param>
/// <param name="DelTag">软删除 删除标志值</param>
/// <returns>如果非软删除则永远返回true 可以忽略</returns>
public void Del(T model, bool IsSoftDel, string Pro = "IsDel", bool DelTag = true)
{
if (!IsSoftDel)
{
db.Set<T>().Attach(model);
db.Set<T>().Remove(model);
}
else
{
var listPro = typeof(T).GetProperties().ToList();
for (int i = ; i < listPro.Count; i++)
{
if (listPro[i].Name == Pro)
{
listPro[i].SetValue(model, DelTag, null);
}
}
Up(model, Pro);
}
}
#endregion #region 2.1 删除方法2 根据条件删除对象 +Del(Expression<Func<Tclass, bool>> delWhere)
/// <summary>
/// 2.1 删除方法2 根据条件删除对象
/// </summary>
/// <param name="delWhere">删除条件</param>
/// <param name="IsSoftDel">是否软删除</param>
/// <param name="Pro">软删除 要修改的删除标志字段</param>
/// <param name="DelTag">软删除 删除标志值</param>
public void Del(Expression<Func<T, bool>> delWhere, bool IsSoftDel, string Pro = "IsDel", bool DelTag = true)
{
var modelS = db.Set<T>().Where(delWhere).ToList();
if (!IsSoftDel)
{
modelS.ForEach(m =>
{
db.Set<T>().Attach(m);
db.Set<T>().Remove(m);
});
}
else //软删除
{
var listPro = typeof(T).GetProperties().ToList();
foreach (var mymodel in modelS)
{
for (int i = ; i < listPro.Count; i++)
{
if (listPro[i].Name == Pro)
{
listPro[i].SetValue(mymodel, DelTag, null);
}
if (listPro[i].Name == "UpTime")
{
listPro[i].SetValue(mymodel, DateTime.Now, null);
}
}
}
}
}
#endregion #region 3.0 修改方法1 修改某个实体的 某些属性 +Up(Tclass model, params string[] strparams)
/// <summary>
/// 3.0 修改方法1 修改某个实体的 某些属性(根据id修改)【*用这个需要注意关闭检查】
/// </summary>
/// <param name="model"></param>
/// <param name="strparams">可变参数</param>
public void Up(T model, params string[] strparams)
{
var m = db.Entry<T>(model);
m.State = System.Data.Entity.EntityState.Unchanged; for (int i = ; i < strparams.Length; i++)
{
m.Property(strparams[i]).IsModified = true;
}
m.Property("UpTime").IsModified = true;
} #endregion #region 3.1 修改方法2 根据条件 修改指定的 属性 值 +Up(Expression<Func<Tclass, bool>> upWhere, Tclass model, params string[] strparame)
/// <summary>
/// 3.1 修改方法2 根据条件 修改指定的 属性 值
/// </summary>
/// <param name="upWhere">要修改的数据的 条件</param>
/// <param name="IsUpDelData">是否修改已经软删除过的数据</param>
/// <param name="model">要修改的model对象</param>
/// <param name="strparame">要修改的字段名</param>
public void Up(Expression<Func<T, bool>> upWhere, bool IsUpDelData, T model, params string[] strparame)
{
var modelS = GetList(upWhere, IsUpDelData).ToList(); var listPro = typeof(T).GetProperties().ToList();
List<PropertyInfo> dic = new List<PropertyInfo>(); listPro.ForEach(l =>
{
for (int i = ; i < strparame.Length; i++)
{
if (l.Name == strparame[i].Trim() || l.Name == "UpTime")
{
dic.Add(l);
break;
}
}
}); if (dic.Count > )
{
foreach (var property in dic)
{
var newValue = property.GetValue(model, null);
foreach( var mymodel in modelS)
{
property.SetValue(mymodel, newValue, null); }
}
} }
#endregion #region 4.0 查询方法 +GetList<Tkey>(Expression<Func<Tclass, bool>> strWhere, Expression<Func<Tclass, Tkey>> strOrederBy = null, bool order = true)
/// <summary>
/// 4.0 查询方法
/// </summary>
/// <typeparam name="Tkey">如果strOrederBy为null Tkey也可以DBNull</typeparam>
/// <param name="strWhere">查询条件</param>
/// <param name="SelectDelData">查询的结果集中 是否包括 已经软删除的数据</param>
/// <param name="strOrederBy">排序条件</param>
/// <param name="order">是否升序</param>
/// <param name="tableName">连接查询 的表名</param>
/// <returns></returns>
public IQueryable<T> GetList(Expression<Func<T, bool>> strWhere, bool SelectDelData = false, bool isAsNoTracking = true, string tableName = null)
{
Expression<Func<T, bool>> exp = strWhere;
//if (!SelectDelData)
// AddLinq.And(exp, GetWhereIsDel()); IQueryable<T> t = null; if (isAsNoTracking)
{
if (string.IsNullOrEmpty(tableName))
t = db.Set<T>().AsNoTracking().Where(exp);
else
t = db.Set<T>().Include(tableName).AsNoTracking().Where(exp);
}
else
{
if (string.IsNullOrEmpty(tableName))
t = db.Set<T>().Where(exp);
else
t = db.Set<T>().Include(tableName).Where(exp);
}
return t;
}
/// <summary>
/// 4.0.2 查询方法
/// </summary>
/// <typeparam name="Tkey">如果strOrederBy为null Tkey也可以DBNull</typeparam>
/// <param name="strWhere">查询条件</param>
/// <param name="SelectDelData">查询的结果集中 是否包括 已经软删除的数据</param>
/// <param name="strOrederBy">排序条件</param>
/// <param name="order">是否升序</param>
/// <param name="tableName">连接查询 的表名</param>
/// <returns></returns>
public IQueryable<T> GetList<TTb>(Expression<Func<T, bool>> strWhere, bool SelectDelData = false, bool isAsNoTracking = true, Expression<Func<T, TTb>> tableName = null)
{
Expression<Func<T, bool>> exp = strWhere;
//if (!SelectDelData)
// exp = AddLinq.And(exp, GetWhereIsDel());//合并 排除一删除查询条件 IQueryable<T> t = null;
if (isAsNoTracking)
if (null == tableName)
t = db.Set<T>().AsNoTracking().Where(exp);
else
t = db.Set<T>().Include(tableName).AsNoTracking().Where(exp);
else
if (null == tableName)
t = db.Set<T>().Where(exp);
else
t = db.Set<T>().Include(tableName).Where(exp); return t;
} #endregion
#region 4.1 查询方法2 分页查询 +GetList<Tkey>(int indexPage, int sizePage, Expression<Func<Tclass, bool>> strWhere, Expression<Func<Tclass, Tkey>> strOrederBy = null, bool order = true)
/// <summary>
/// 4.1 查询方法2 分页查询
/// </summary>
/// <typeparam name="Tkey">如果strOrederBy为null Tkey也可以DBNull</typeparam>
/// <param name="indexPage">页码(从1开始)</param>
/// <param name="sizePage">页容量</param>
/// <param name="total">总页数</param>
/// <param name="strWhere">查询条件</param>
/// <param name="SelectDelData">查询的结果集中 是否包括 已经软删除的数据</param>
/// <param name="strOrederBy">排序字段</param>
/// <param name="order">是否升序</param>
/// <param name="tableName">连接查询 的表名</param>
/// <returns></returns>
public IQueryable<T> GetList<Tkey>(int indexPage, int sizePage, out int total, Expression<Func<T, bool>> strWhere, bool SelectDelData = false, Expression<Func<T, Tkey>> strOrederBy = null, bool order = true, bool isAsNoTracking = true, string tableName = null)
{
Expression<Func<T, bool>> exp = strWhere;
//if (!SelectDelData)
// exp = AddLinq.And(exp, GetWhereIsDel());//合并 排除一删除查询条件 IQueryable<T> t = null;
if (isAsNoTracking)
if (string.IsNullOrEmpty(tableName))
t = db.Set<T>().AsNoTracking().Where(exp);
else
t = db.Set<T>().Include(tableName).AsNoTracking().Where(exp);
else
if (string.IsNullOrEmpty(tableName))
t = db.Set<T>().Where(exp);
else
t = db.Set<T>().Include(tableName).Where(exp); if (strOrederBy != null)
{
if (order)
t = t.OrderBy(strOrederBy);
else
t = t.OrderByDescending(strOrederBy);
}
int count = t.Count();
total = count / sizePage + (count % sizePage > ? : );
return t.Skip((indexPage - ) * sizePage).Take(sizePage);
} /// <summary>
/// 4.1.2 查询方法2 分页查询
/// </summary>
/// <typeparam name="Tkey">如果strOrederBy为null Tkey也可以DBNull</typeparam>
/// <param name="indexPage">页码(从1开始)</param>
/// <param name="sizePage">页容量</param>
/// <param name="total">总页数</param>
/// <param name="strWhere">查询条件</param>
/// <param name="SelectDelData">查询的结果集中 是否包括 已经软删除的数据</param>
/// <param name="strOrederBy">排序字段</param>
/// <param name="order">是否升序</param>
/// <param name="tableName">连接查询 的表名</param>
/// <returns></returns>
public IQueryable<T> GetList<Tkey, TTb>(int indexPage, int sizePage, out int total, Expression<Func<T, bool>> strWhere, bool SelectDelData = false, Expression<Func<T, Tkey>> strOrederBy = null, bool order = true, bool isAsNoTracking = true, Expression<Func<T, TTb>> tableName = null)
{
Expression<Func<T, bool>> exp = strWhere;
//if (!SelectDelData)
// exp = AddLinq.And(exp, GetWhereIsDel());//合并 排除一删除查询条件 IQueryable<T> t = null;
if (isAsNoTracking)
if (null == tableName)
t = db.Set<T>().AsNoTracking().Where(exp);
else
t = db.Set<T>().Include(tableName).AsNoTracking().Where(exp);
else
if (null == tableName)
t = db.Set<T>().Where(exp);
else
t = db.Set<T>().Include(tableName).Where(exp); if (strOrederBy != null)
{
if (order)
t = t.OrderBy(strOrederBy);
else
t = t.OrderByDescending(strOrederBy);
}
int count = t.Count();
total = count / sizePage + (count % sizePage > ? : );
return t.Skip((indexPage - ) * sizePage).Take(sizePage);
} #endregion
#region 5.0 返回 已经删除的 linq 拼接条件
/// <summary>
/// 返回 已经删除的 linq 拼接条件
/// </summary>
/// <returns></returns>
//private static Expression<Func<T, bool>> GetWhereIsDel()
//{
// return t => t.IsDel == false;
//}
#endregion #region 提交 +save()
/// <summary>
/// 提交
/// </summary>
/// <param name="ValidateOnSaveEnabled">是否打开验证</param>
/// <returns></returns>
public int save(bool ValidateOnSaveEnabled = true)
{
db.Configuration.ValidateOnSaveEnabled = ValidateOnSaveEnabled;
return db.SaveChanges();
} public static int StaticSave(bool ValidateOnSaveEnabled = true)
{
dbEntities.Configuration.ValidateOnSaveEnabled = ValidateOnSaveEnabled;
return dbEntities.SaveChanges();
} #endregion
}
}

ef操作类的更多相关文章

  1. ASP.net如何保证EF操作类线程内唯一

    说到线程内唯一,肯定会想到单例模式,但是如果多用户访问网站就会出现问题.ASP.net中有两种方法可以保证EF操作类线程内唯一(目前只会这两种,以后有好的方法再添加): 1.httpcontext(实 ...

  2. EF操作MySql

    EF的CodeFrist操作MySql的提前准备: 1.安装两个包:MySql.Data和MySql.Data.Entity,在VS中程序包管理器中添加2个包.(备注需要的VS2015,并且EF6支持 ...

  3. [转]html5 js 访问 sqlite 数据库的操作类

    本文转自:http://blog.csdn.net/tsxw24/article/details/7613815 webkit 核心的浏览器提供了 3个 api接口,用于访问本地sqlite数据,但使 ...

  4. EF操作扩展之async

    EF的操作类网上很多类,我只是把我在平时项目中的类进行一些改进和扩展,扩展了部分同步和异步的EF操作 接口 /// <summary> /// 接口数据操作基础类 /// </sum ...

  5. EF操作数据库的步骤和一些简单操作语句

    这里是写给我自己做记录的,不会写成一篇很好的博客,也不会置顶,如果有朋友看到了,而且觉得里面的内容不咋的,希望见谅哈! 关于这部分内容,这里推荐一篇总结的非常好的博客,如果你点击进来了,那么请略过下面 ...

  6. 【知识必备】ezSQL,最好用的数据库操作类,让php操作sql更简单~

    最近用php做了点小东东,用上了ezSQL,感觉真的很ez,所以拿来跟大家分享一下~ ezSQL是一个非常好用的PHP数据库操作类.著名的开源博客WordPress的数据库操作就使用了ezSQL的My ...

  7. JQuery操作类数组的工具方法

    JQuery学习之操作类数组的工具方法 在很多时候,JQuery的$()函数都返回一个类似数据的JQuery对象,例如$('div')将返回div里面的所有div元素包装的JQuery对象.在这中情况 ...

  8. Util应用程序框架公共操作类(十二):Lambda表达式公共操作类(三)

    今天在开发一个简单查询时,发现我的Lambda操作类的GetValue方法无法正确获取枚举类型值,以至查询结果错误. 我增加了几个单元测试来捕获错误,代码如下. /// <summary> ...

  9. Util应用程序框架公共操作类(九):Lambda表达式扩展

    上一篇对Lambda表达式公共操作类进行了一些增强,本篇使用扩展方法对Lambda表达式进行扩展. 修改Util项目的Extensions.Expression.cs文件,代码如下. using Sy ...

随机推荐

  1. 如何自定义ViewGroup

    依照惯例,先从一个例子说起. 很简单,3张扑克牌叠在一起显示.这个布局效果该如何实现呢?有的同学该说了,这很简单啊,用RelativeLayout或FrameLayout,然后为每一个扑克牌设置mar ...

  2. App Transport Security has blocked a cleartext

    错误描述: App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecu ...

  3. Xcode快捷键大全

    转载地址http://www.360doc.com/content/12/0521/09/6541311_212458595.shtml.

  4. OC 初识NSString,self关键字,继承,成员变量的可见性,description方法

    OC 初识NSString,self关键字,继承,成员变量的可见性,description方法 初识 NSString: char * string = "旭宝爱吃鱼"; 常量字符 ...

  5. 转:能和LoadRunner匹敌的VS2010/2012Web负载测试

    原文出处:http://www.cnblogs.com/aarond/archive/2013/04/18/performance.html VS自带的Web负载测试真的很大程度上能和专业的loadr ...

  6. WPF学习之路(十)实例:用户注册

    通过一个注册用户的实例了解页面间数据的传递 首先构建一个User类  User.cs public class User { private string name; public string Na ...

  7. css3:盒模型以及box-sizing属性

    文档中的每个元素被描绘为矩形盒子.渲染引擎的目的就是判定大小,属性——比如它的颜色.背景.边框方面——及这些盒子的位置.在CSS中,这些矩形盒子用标准盒模型来描述.这个模型描述了一个元素所占用的空间. ...

  8. yii2 GridView常见操作

    作者:白狼 出处:http://www.manks.top/article/yii2_gridview 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  9. ArrayList

    各种原因,前两年做C语言去了,现在重新做JAVA, 感觉自己基础很不扎实,要好好学习啦, 先从简单的开始~ 以下内容基于jdk1.7.0_79源码: 什么是ArrayList 可以简单的认为是一个动态 ...

  10. SSRS 的简单使用(二)

    经过上一篇的初始,我们已经做好了报表的准备工作,接下来我们进行报表的展示和其他一下操作,并且给出一些使用RS的方法方便大家日后能灵活使用. 步骤:        1.首先拖拽表格等进入到设计模板 点击 ...