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 ...
随机推荐
- 【Leafletjs】1.创建一个地图
code: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <l ...
- Android开发实战(十八):Android Studio 优秀插件:GsonFormat
Android Studio 优秀插件系列: Android Studio 优秀插件(一):GsonFormat Android Studio 优秀插件(二): Parcelable Code Gen ...
- 【读书笔记】iOS网络-负载
负载指的是在服务的请求响应事务中交换的数据.常见的负载格式包括XML,JSON与HTML. 进入与发出的负载数据存在很多形式与大小.比如,有些开发者会使用原生的字符串或是以分隔符分开的数据与Web S ...
- Android网络请求框架
本篇主要介绍一下Android中经常用到的网络请求框架: 客户端网络请求,就是客户端发起网络请求,经过网络框架的特殊处理,让后将请求发送的服务器,服务器根据 请求的参数,返回客户端需要的数据,经过网络 ...
- js 浮点运算出现的精度丢失问题
var myf='6.202555'; myf=Number(myf).toFixed(2);//使用方法 Number.prototype.toFixed = function(scale) { v ...
- 编写IoDemo.java的Java应用程序,程序完成的功能是:首先读取text.txt文件内容,再通过键盘输入文件的名称为iodemo.txt,把text.txt的内容存入iodemo.txt
package zuoye; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcep ...
- SQL语句查询某表的所有字段及数据类型
SQL语句查询某表的所有字段及数据类型 SELECT name AS column_name , TYPE_NAME(system_type_id) AS column_type , max_leng ...
- windows开关机时间记录
1. 开机时间记录批处理文件,kai.bat @echo off echo %date% %time% 开机 >>D:\开关机记录\开关机时间.txt 2. 关机时间记录批处理文件,gua ...
- iOS沙盒路径变化的说明详解
最近用沙盒存储文件的时候发现了一个奇怪的现象,由于业务需要,我会将保存的文件绝对路径保存以便下次读取. 于是发现一个找不到的现象,即上一次保存下的绝对路径,再第二次打开app去查找的时候,发现找不到. ...
- Vim光标定位
*定位到指定行n: 输入"nG". 或输入"ngg". 或输入":n" 这里,n就是指定的行的行号.注意,有时候G=gg. *跳到屏幕顶部: ...