ef操作类
基于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操作类的更多相关文章
- ASP.net如何保证EF操作类线程内唯一
说到线程内唯一,肯定会想到单例模式,但是如果多用户访问网站就会出现问题.ASP.net中有两种方法可以保证EF操作类线程内唯一(目前只会这两种,以后有好的方法再添加): 1.httpcontext(实 ...
- EF操作MySql
EF的CodeFrist操作MySql的提前准备: 1.安装两个包:MySql.Data和MySql.Data.Entity,在VS中程序包管理器中添加2个包.(备注需要的VS2015,并且EF6支持 ...
- [转]html5 js 访问 sqlite 数据库的操作类
本文转自:http://blog.csdn.net/tsxw24/article/details/7613815 webkit 核心的浏览器提供了 3个 api接口,用于访问本地sqlite数据,但使 ...
- EF操作扩展之async
EF的操作类网上很多类,我只是把我在平时项目中的类进行一些改进和扩展,扩展了部分同步和异步的EF操作 接口 /// <summary> /// 接口数据操作基础类 /// </sum ...
- EF操作数据库的步骤和一些简单操作语句
这里是写给我自己做记录的,不会写成一篇很好的博客,也不会置顶,如果有朋友看到了,而且觉得里面的内容不咋的,希望见谅哈! 关于这部分内容,这里推荐一篇总结的非常好的博客,如果你点击进来了,那么请略过下面 ...
- 【知识必备】ezSQL,最好用的数据库操作类,让php操作sql更简单~
最近用php做了点小东东,用上了ezSQL,感觉真的很ez,所以拿来跟大家分享一下~ ezSQL是一个非常好用的PHP数据库操作类.著名的开源博客WordPress的数据库操作就使用了ezSQL的My ...
- JQuery操作类数组的工具方法
JQuery学习之操作类数组的工具方法 在很多时候,JQuery的$()函数都返回一个类似数据的JQuery对象,例如$('div')将返回div里面的所有div元素包装的JQuery对象.在这中情况 ...
- Util应用程序框架公共操作类(十二):Lambda表达式公共操作类(三)
今天在开发一个简单查询时,发现我的Lambda操作类的GetValue方法无法正确获取枚举类型值,以至查询结果错误. 我增加了几个单元测试来捕获错误,代码如下. /// <summary> ...
- Util应用程序框架公共操作类(九):Lambda表达式扩展
上一篇对Lambda表达式公共操作类进行了一些增强,本篇使用扩展方法对Lambda表达式进行扩展. 修改Util项目的Extensions.Expression.cs文件,代码如下. using Sy ...
随机推荐
- android https正确调用方案(防中间人劫持)
以下内容为原创,欢迎转载,转载请注明 来自博客园:http://www.cnblogs.com/joey-hua/p/4971380.html 1.劫持https接口 很多android客户端虽然使用 ...
- Android 项目实战--手机卫士(实现splash)
从今天开始根据之前学习的android的基础知识,实战一下,实现一个简单功能的android手机卫士 本文地址:http://www.cnblogs.com/wuyudong/p/5899283.ht ...
- UILabel和NSAttributedString那些事
注:通常的label用来现实普通的文字.但是,你常常会遇到这样的情况:一段文字中不仅有文字,也有图片,甚至文字中的某段文字与其他的文字的appearance不一致的情况,这样的一段文字就可以称得上是富 ...
- Getting Started with ASP.NET Web API 2 (C#)
By Mike Wasson|last updated May 28, 2015 7556 of 8454 people found this helpful Print Download Com ...
- [PL/SQL]使用PL/SQL实现ORACLE的Excel格式导入导出
注:教程所使用的PL/SQL Developer版本为10版本 1.oracle导出excel格式 第一步,在pl/sql窗口查询出你想要导出的数据. 第二步,选择你想导出的数据,然后右键" ...
- Maven基础配置—上传jar包到私服
一.配置 在需要上传的工程中的pom.xml文件中加入下面的配置 <distributionManagement> <repository> <id>release ...
- Mongodb源代码阅读笔记:Journal机制
Mongodb源代码阅读笔记:Journal机制 Mongodb源代码阅读笔记:Journal机制 涉及的文件 一些说明 PREPLOGBUFFER WRITETOJOURNAL WRITETODAT ...
- SQL Server字符串左匹配
在SQL Server中经常会用到模糊匹配字符串的情况,最简单的办法就是使用like关键字(like语法http://msdn.microsoft.com/en-us/library/ms179859 ...
- c# 设置winform程序为默认打开软件 在运行中获取参数
1.右键→打开方式→选择默认程序→选择winform程序 2.修改Program.cs 判断注册的事件是否存在,如果不存在则运行实例,并把参数传入MainForm里,如果存在则把参数写到txt文件中, ...
- db2存储过程
一. 使用存储过程的好处 1. 减少客户机与服务器之间的网络使用率,以及数据库锁定保持的时间 应用程序通常在执行每个SQL语句都要跨网络两次,存储过程可以将SQL语句集中在一起, 从而使得对于每一组S ...