Entity FrameWork 6帮助类
public class BaseDAL
{
string strConn = "";
public BaseDAL(string connString)
{
strConn = connString;
} #region 通用增删改查
#region 非原始sql语句方式
/// <summary>
/// 新增
/// </summary>
/// <param name="entity">实体</param>
/// <returns>返回受影响行数</returns>
public bool Add<T>(T entity) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
db.Entry<T>(entity).State = EntityState.Added;
return db.SaveChanges() > ;
}
} /// <summary>
/// 修改
/// </summary>
/// <param name="entity">实体</param>
/// <returns>返回受影响行数</returns>
public bool Update<T>(T entity) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
db.Set<T>().Attach(entity);
db.Entry<T>(entity).State = EntityState.Modified;
return db.SaveChanges() > ;
}
} /// <summary>
/// 删除
/// </summary>
/// <param name="entity">实体</param>
/// <returns>返回受影响行数</returns>
public bool Delete<T>(T entity) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
db.Set<T>().Attach(entity);
db.Entry<T>(entity).State = EntityState.Deleted;
return db.SaveChanges() > ;
}
} /// <summary>
/// 根据条件删除
/// </summary>
/// <param name="deleWhere">删除条件</param>
/// <returns>返回受影响行数</returns>
public bool DeleteByConditon<T>(Expression<Func<T, bool>> deleWhere) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
List<T> entitys = db.Set<T>().Where(deleWhere).ToList();
entitys.ForEach(m => db.Entry<T>(m).State = EntityState.Deleted);
return db.SaveChanges() > ;
}
} /// <summary>
/// 查找单个
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
public T GetSingleById<T>(int id) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return db.Set<T>().Find(id);
}
} /// <summary>
/// 查找单个
/// </summary>
/// <param name="seleWhere">查询条件</param>
/// <returns></returns>
public T GetSingle<T>(Expression<Func<T, bool>> seleWhere) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return db.Set<T>().AsExpandable().FirstOrDefault(seleWhere);
}
} /// <summary>
/// 获取所有实体集合
/// </summary>
/// <returns></returns>
public List<T> GetAll<T>() where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return db.Set<T>().AsExpandable().ToList<T>();
}
} /// <summary>
/// 获取所有实体集合(单个排序)
/// </summary>
/// <returns></returns>
public List<T> GetAll<T, Tkey>(Expression<Func<T, Tkey>> orderWhere, bool isDesc) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return CommonSort(db.Set<T>().AsExpandable(), orderWhere, isDesc).ToList<T>();
}
} /// <summary>
/// 获取所有实体集合(多个排序)
/// </summary>
/// <returns></returns>
public List<T> GetAll<T>(params OrderModelField[] orderByExpression) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return CommonSort(db.Set<T>().AsExpandable(), orderByExpression).ToList();
}
} /// <summary>
/// 单个排序通用方法
/// </summary>
/// <typeparam name="Tkey">排序字段</typeparam>
/// <param name="data">要排序的数据</param>
/// <param name="orderWhere">排序条件</param>
/// <param name="isDesc">是否倒序</param>
/// <returns>排序后的集合</returns>
public IQueryable<T> CommonSort<T, Tkey>(IQueryable<T> data, Expression<Func<T, Tkey>> orderWhere, bool isDesc) where T : class
{
if (isDesc)
{
return data.OrderByDescending(orderWhere);
}
else
{
return data.OrderBy(orderWhere);
}
} /// <summary>
/// 多个排序通用方法
/// </summary>
/// <typeparam name="Tkey">排序字段</typeparam>
/// <param name="data">要排序的数据</param>
/// <param name="orderWhereAndIsDesc">字典集合(排序条件,是否倒序)</param>
/// <returns>排序后的集合</returns>
public IQueryable<T> CommonSort<T>(IQueryable<T> data, params OrderModelField[] orderByExpression) where T : class
{
//创建表达式变量参数
var parameter = Expression.Parameter(typeof(T), "o"); if (orderByExpression != null && orderByExpression.Length > )
{
for (int i = ; i < orderByExpression.Length; i++)
{
//根据属性名获取属性
var property = typeof(T).GetProperty(orderByExpression[i].PropertyName);
//创建一个访问属性的表达式
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
var orderByExp = Expression.Lambda(propertyAccess, parameter); string OrderName = "";
if (i > )
{
OrderName = orderByExpression[i].IsDESC ? "ThenByDescending" : "ThenBy";
}
else
OrderName = orderByExpression[i].IsDESC ? "OrderByDescending" : "OrderBy"; MethodCallExpression resultExp = Expression.Call(typeof(Queryable), OrderName, new Type[] { typeof(T), property.PropertyType },
data.Expression, Expression.Quote(orderByExp)); data = data.Provider.CreateQuery<T>(resultExp);
}
}
return data;
} /// <summary>
/// 根据条件查询实体集合
/// </summary>
/// <param name="seleWhere">查询条件 lambel表达式</param>
/// <returns></returns>
public List<T> GetList<T>(Expression<Func<T, bool>> seleWhere) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return db.Set<T>().AsExpandable().Where(seleWhere).ToList();
}
} /// <summary>
/// 根据条件查询实体集合
/// </summary>
/// <param name="seleWhere">查询条件 lambel表达式</param>
/// <returns></returns>
public List<T> GetList<T, TValue>(Expression<Func<T, TValue>> seleWhere, IEnumerable<TValue> conditions) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{ return db.Set<T>().AsExpandable().WhereIn<T, TValue>(seleWhere, conditions).ToList();
}
} /// <summary>
/// 根据条件查询实体集合(单个字段排序)
/// </summary>
/// <param name="seleWhere">查询条件 lambel表达式</param>
/// <returns></returns>
public List<T> GetList<T, Tkey>(Expression<Func<T, bool>> seleWhere, Expression<Func<T, Tkey>> orderWhere, bool isDesc) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return CommonSort(db.Set<T>().AsExpandable().Where(seleWhere), orderWhere, isDesc).ToList();
}
} /// <summary>
/// 根据条件查询实体集合(多个字段排序)
/// </summary>
/// <param name="seleWhere">查询条件 lambel表达式</param>
/// <returns></returns>
public List<T> GetList<T>(Expression<Func<T, bool>> seleWhere, params OrderModelField[] orderByExpression) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return CommonSort(db.Set<T>().AsExpandable().Where(seleWhere), orderByExpression).ToList();
}
} /// <summary>
/// 获取分页集合(无条件无排序)
/// </summary>
/// <returns></returns>
public List<T> GetListPaged<T, Tkey>(int pageIndex, int pageSize, out int totalcount) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
totalcount = db.Set<T>().AsExpandable().Count();//获取总数
//需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
return db.Set<T>().AsExpandable().Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}
} /// <summary>
/// 获取分页集合(无条件单个排序)
/// </summary>
/// <returns></returns>
public List<T> GetListPaged<T, Tkey>(int pageIndex, int pageSize, Expression<Func<T, Tkey>> orderWhere, bool isDesc, out int totalcount) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
totalcount = db.Set<T>().AsExpandable().Count();//获取总数
//需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
return CommonSort(db.Set<T>().AsExpandable(), orderWhere, isDesc).Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}
} /// <summary>
/// 获取分页集合(无条件多字段排序)
/// </summary>
/// <returns></returns>
public List<T> GetListPaged<T>(int pageIndex, int pageSize, out int totalcount, params OrderModelField[] orderByExpression) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
totalcount = db.Set<T>().AsExpandable().Count();//获取总数
//需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
return CommonSort(db.Set<T>().AsExpandable(), orderByExpression).Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}
} /// <summary>
/// 获取分页集合(有条件无排序)
/// </summary>
/// <returns></returns>
public List<T> GetListPaged<T, Tkey>(int pageIndex, int pageSize, Expression<Func<T, bool>> seleWhere, out int totalcount) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
totalcount = db.Set<T>().AsExpandable().Where(seleWhere).Count();//获取总数
//需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
return db.Set<T>().AsExpandable().Where(seleWhere).Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}
} /// <summary>
/// 获取分页集合(有条件单个排序)
/// </summary>
/// <returns></returns>
public List<T> GetListPaged<T, Tkey>(int pageIndex, int pageSize, Expression<Func<T, bool>> seleWhere,
Expression<Func<T, Tkey>> orderWhere, bool isDesc, out int totalcount) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
totalcount = db.Set<T>().AsExpandable().Where(seleWhere).Count();//获取总数
//需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
return CommonSort(db.Set<T>().AsExpandable().Where(seleWhere), orderWhere, isDesc).Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}
} /// <summary>
/// 获取分页集合(有条件多字段排序)
/// </summary>
/// <returns></returns>
public List<T> GetListPaged<T>(int pageIndex, int pageSize, Expression<Func<T, bool>> seleWhere,
out int totalcount, params OrderModelField[] orderModelFiled) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
totalcount = db.Set<T>().AsExpandable().Where(seleWhere).Count();//获取总数
//需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
return CommonSort(db.Set<T>().AsExpandable().Where(seleWhere), orderModelFiled).Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}
}
#endregion #region 原始sql操作
/// <summary>
/// 执行操作
/// </summary>
/// <param name="sql"></param>
/// <param name="paras"></param>
public void ExecuteSql(string sql, params object[] paras)
{
using (SysDb db = new SysDb(strConn))
{
db.Database.ExecuteSqlCommand(sql, paras);
}
} /// <summary>
/// 查询列表
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="paras"></param>
/// <returns></returns>
public List<T> QueryList<T>(string sql, params object[] paras) where T : class
{
using (SysDb db = new SysDb(strConn))
{
return db.Database.SqlQuery<T>(sql, paras).ToList();
}
} /// <summary>
/// 查询单个
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="paras"></param>
/// <returns></returns>
public T QuerySingle<T>(string sql, params object[] paras) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return db.Database.SqlQuery<T>(sql, paras).FirstOrDefault();
}
} /// <summary>
/// 执行事务
/// </summary>
/// <param name="lsSql"></param>
/// <param name="lsParas"></param>
public void ExecuteTransaction(List<String> lsSql, List<Object[]> lsParas)
{
using (SysDb db = new SysDb(strConn))
{
using (var tran = db.Database.BeginTransaction())
{
try
{
for (int i = ; i < lsSql.Count; i++)
{
if (lsParas != null && lsParas.Count > )
{
db.Database.ExecuteSqlCommand(lsSql[i], lsParas[i]);
}
}
foreach (String item in lsSql)
{
db.Database.ExecuteSqlCommand(item);
} tran.Commit();
}
catch (Exception ex)
{
tran.Rollback();
throw ex;
}
}
}
}
#endregion
#endregion #region 通用属性
/// <summary>
/// 获取数据库服务器当前时间。
/// </summary>
public DateTime ServerTime
{
get
{
using (SysDb db = new SysDb(strConn))
{
String sql = "SELECT GETDATE()";
Object objServerTime = db.Database.SqlQuery<Object>(sql);
return Convert.ToDateTime(objServerTime);
}
}
} /// <summary>
/// 获取数据库版本。
/// </summary>
public String DatabaseVersion
{
get
{
using (SysDb db = new SysDb(strConn))
{
try
{
String sql = "SELECT Version FROM Sys_Version";
Object objServerTime = db.Database.SqlQuery<Object>(sql);
return Convert.ToString(objServerTime);
}
catch
{
}
return String.Empty;
}
}
}
#endregion }
public static class QueryableExtension
{
/// <summary>
/// 扩展方法 支持 in 操作
/// </summary>
/// <typeparam name="TEntity">需要扩展的对象类型</typeparam>
/// <typeparam name="TValue">in 的值类型</typeparam>
/// <param name="source">需要扩展的对象</param>
/// <param name="valueSelector">值选择器 例如c=>c.UserId</param>
/// <param name="values">值集合</param>
/// <returns></returns>
public static IQueryable<TEntity> WhereIn<TEntity, TValue>(this IQueryable<TEntity> source, Expression<Func<TEntity, TValue>> valueSelector,
IEnumerable<TValue> values)
{
if (null == valueSelector) { throw new ArgumentNullException("valueSelector"); }
if (null == values) { throw new ArgumentNullException("values"); }
ParameterExpression p = valueSelector.Parameters.Single(); if (!values.Any())
{
return source;
}
var equals = values.Select(value => (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value, typeof(TValue))));
var body = equals.Aggregate<Expression>((accumulate, equal) => Expression.Or(accumulate, equal));
return source.Where(Expression.Lambda<Func<TEntity, bool>>(body, p));
}
}
public struct OrderModelField
{ public bool IsDESC { get; set; }
public string PropertyName { get; set; }
}
dbcontext类: public class SysDb : DbContext
{
bool isNew = true;//是否是新的sql执行
string strMsg = "";//sql执行的相关信息
string strConn = "";//数据库连接字符串
string UserName = "";//日志用户名称
string AdditionalInfo = "";//日志额外信息
public SysDb(string connString) : // 数据库链接字符串
base(connString)
{
strConn = connString;
Database.SetInitializer<SysDb>(null);//设置为空,防止自动检查和生成
base.Database.Log = (info) => Debug.WriteLine(info);
} public SysDb(string connString, string logUserName, string logAdditionalInfo) : // 数据库链接字符串
base(connString)
{
strConn = connString;
Database.SetInitializer<SysDb>(null);//设置为空,防止自动检查和生成
UserName = logUserName;
AdditionalInfo = logAdditionalInfo;
base.Database.Log = AddLogger;
} protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//去掉复数映射
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
base.OnModelCreating(modelBuilder);
} /// <summary>
/// 添加日志
/// </summary>
/// <param name="info"></param>
public void AddLogger(string info)
{
if (info != "\r\n" && (!info.Contains("Sys_EventLog")))
{
string strTemp = info.ToUpper().Trim();
if (isNew)
{
//记录增删改
if (strTemp.StartsWith("INSERT") || strTemp.StartsWith("UPDATE") || strTemp.StartsWith("DELETE"))
{
strMsg = info;
isNew = false;
}
}
else
{
if (strTemp.StartsWith("CLOSED CONNECTION"))
{
//增加新日志
using (SysDb db = new SysDb(strConn))
{
try
{
//保存日志到数据库或其他地方 }
catch (Exception ex)
{
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "//logError.txt"))
{
sw.Write(ex.Message);
sw.Flush();
}
}
}
//清空
strMsg = "";
isNew = true;
}
else
{
strMsg += info;
}
} }
} }
public class SysDb<T> : SysDb where T : class
{
public SysDb(string connString) : // 数据库链接字符串
base(connString)
{
Database.SetInitializer<SysDb<T>>(null);//设置为空,防止自动检查和生成
} public SysDb(string connString, string logUserName, string logAdditionalInfo) : // 数据库链接字符串
base(connString,logUserName,logAdditionalInfo)
{
Database.SetInitializer<SysDb<T>>(null);//设置为空,防止自动检查和生成
} public DbSet<T> Entities { get; set; }
}
界面使用:(bll层忽略) public class BusinessController : Controller
{
//
// GET: /Jygl/Business/
BaseBLL basebll = new BaseBLL(WebHelper.Conn); public ActionResult GetXMList(int page,int rows)
{
int count = ;
//查询条件
//Expression<Func<JY_XM, bool>> searchPredicate = PredicateBuilder.True<JY_XM>();
//searchPredicate = searchPredicate.And(c => c.UserName.Contains(""));
Expression<Func<JY_XM, int>> keySelector = u => u.UID;
string str = ExceptionHelper<JY_XM>.TryCatchPageQueryJson<int>(basebll.GetListPaged, page, rows, keySelector, false, out count);
return Content(str);
} [HttpPost]
public ActionResult XMEdit(JY_XM jyxm)
{
basebll.Add(jyxm);
return View();
} public ActionResult GetAllGCLB()
{ List<DICT_GCLB> lsGCLB = basebll.GetAll<DICT_GCLB>();
DICT_GCLB dicNew=new DICT_GCLB();
dicNew.GCLBText="-请选择-";
dicNew.GCLBId=;
lsGCLB.Add(dicNew); return Content(WebHelper.Json(lsGCLB));
} public ActionResult GetAllArea()
{
List<DICT_Area> lsArea = basebll.GetAll<DICT_Area>();
DICT_Area dicNew=new DICT_Area();
dicNew.AreaText="-请选择-";
dicNew.AreaId=;
lsArea.Add(dicNew);
return Content(WebHelper.Json(lsArea));
}
}
Entity FrameWork 6帮助类的更多相关文章
- Asp.Net MVC 使用Entity Framework创建模型类
先来说说LINQ to SQL和Entity Framework的区别: LINQ to SQL和Entity Framework都是一种包含LINQ功能的对象关系映射技术.他们之间的本质区别在于EF ...
- Asp.Net MVC 模型(使用Entity Framework创建模型类) - Part.1
这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework来创建数据访问类.这篇教程假设你事先对Microsoft Entity Fram ...
- Asp.Net MVC 模型(使用Entity Framework创建模型类)
这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework来创建数据访问类.这篇教程假设你事先对Microsoft Entity Fram ...
- entity framework 封装基类
/// <summary> /// 查询业务基实现 /// </summary> /// <typeparam name="T"></ty ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- 如何处理Entity Framework / Entity Framework Core中的DbUpdateConcurrencyException异常(转载)
1. Concurrency的作用 场景有个修改用户的页面功能,我们有一条数据User, ID是1的这个User的年龄是20, 性别是female(数据库中的原始数据)正确的该User的年龄是25, ...
- 《Entity Framework 6 Recipes》中文翻译系列 (16) -----第三章 查询之左连接和在TPH中通过派生类排序
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-10应用左连接 问题 你想使用左外连接来合并两个实体的属性. 解决方案 假设你有 ...
- Entity Framework 实体框架的形成之旅--为基础类库接口增加单元测试,对基类接口进行正确性校验(10)
本篇介绍Entity Framework 实体框架的文章已经到了第十篇了,对实体框架的各个分层以及基类的封装管理,已经臻于完善,为了方便对基类接口的正确性校验,以及方便对以后完善或扩展接口进行回归测试 ...
- Entity Framework 实体框架的形成之旅--基类接口的统一和异步操作的实现(3)
在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...
随机推荐
- 深圳电信光纤用户必备:简单破解中兴ZXA10 F460光电猫,实现WIFI和自动拨号功能
最近搬家,ADSL转成光纤宽带,下载速度非常给力.原来的ADSL路由器派不上用场,电信的安装人员也给开通了wifi功能,只是wifi无法上网,而且拨号一定需要用电脑连网线进行拨号.以前是直接把拨号账户 ...
- 剑指Offer面试题:3.替换空格
一.题目:替换空格 题目:请实现一个函数,把字符串中的每个空格替换成"%20".例如输入“We are happy.”,则输出“We%20are%20happy.”. 在网络编程中 ...
- 剑指Offer面试题:33.二叉树的深度
一.题目一:二叉树的深度 1.1 题目说明 题目一:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如下图中的二叉树的 ...
- 过年7天乐,学nodejs 也快乐
自从上次接触nodejs 已经好长时间了,但是年底公司太忙了 ,没时间看, 上次文章在ubuntu上安装nodejs[开启实时web时代] http://www.cnblogs.com/qqlovin ...
- spring mvc Error instantiating class ** with invalid types () or values (). Cause: java.lang.NoSuchMethodException:
一般引起这种问题的原因是 bean和mapper里面的字段未对应上,或者 bean里面没有默认的构造函数引起的.我今天是后面的一个,自己写了带参数的构造函数引起的这个问题...
- <dependency>
<dependency> <groupId>org.hibernate</groupId> ...
- Box Model,边距折叠,内联和块标签,CSSReset
一.盒子模型(Box Model) 1.1.宽度测试 1.2.溢出测试 1.3.box-sizing属性 1.4.利用CSS画图 二.边距折叠 2.1.概要 2.2.垂直方向外边距合并计算 三.内联与 ...
- Trace Flag
Trace Flag能够影响Sql Server的行为,主要用于diagnose performance issue,官方解释是: Trace flags are used to temporaril ...
- gcc
gcc编译源文件一步到位的命令就是 $ gcc demo.c -o demo 实际上这一步包含了四步: 1.预处理 $ gcc -E demo.c demo.i 预处理功能主要包括宏定义,文件包含,条 ...
- 深入理解定时器系列第二篇——被誉为神器的requestAnimationFrame
× 目录 [1]引入 [2]特点 [3]使用[4]兼容[5]应用 前面的话 与setTimeout和setInterval不同,requestAnimationFrame不需要设置时间间隔.这有什么好 ...