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 实体框架的一些基础知识,以及构建 ...
随机推荐
- jQuery.Callbacks之demo
jQuery.Callbacks是jquery在1.7版本之后加入的,是从1.6版中的_Deferred对象中抽离的,主要用来进行函数队列的add.remove.fire.lock等操作,并提供onc ...
- C#设计模式之桥接
IronMan之桥接 前言 前面的几个篇幅都是在讲"部件"的生产已经简简单单的使用,以后可能要对"部件"进行升级,不是不对它本身升级,是其它方式的升级,可以让它 ...
- Windows Azure Storage (20) 使用Azure File实现共享文件夹
<Windows Azure Platform 系列文章目录> Update 2016-4-14.在Azure VM配置FTP和IIS,请参考: http://blogs.iis.net/ ...
- 在drawable 画胶囊状
<solid android:color="@color/colorAccent"></solid> <corners android:radius= ...
- Zabbix实现微信报警
一. 申请企业微信账号,申请地址 https://qy.weixin.qq.com/ 二. 登陆企业微信账 图一 图二 2.添加微信账号 图一 图二 完成以上步骤后 就完成了微信账号的添加 三.新建 ...
- jQuery2.0.3源码分析系列(28) 元素大小
最近的分析都是有点不温不火,基本都是基础的回顾了 今年博客的目标目前总的来说有2大块 JS版的设计模式,会用jQuery来诠释 JS版的数据结构,最近也一直在狠狠的学习中. HTML息息相关的的样式 ...
- IOS开发资料汇总
1 IOS账号注册.程序发布流程 1)http://jamesli.cn/blog/?p=955 2)http://jamesli.cn/blog/?p=966 3)http://jamesli.cn ...
- Android NDK开发Hello Word!
在之前的博客中已经为大家介绍了,如何在win环境下配置DNK程序,本篇我将带大家实现一个简单的Hello jni程序,让大家真正感受一下NDK开发的魅力.这里我们选择使用C+JAVA开发Android ...
- Oracle之PL/SQL学习笔记
自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家 ...
- ios使用jspatch中需要注意的事项
第一份代码,为了纠正原代码不显示29号的bug,先上代码 require('NSString','MCDatePickType','NSMutableArray','UIButton'); defin ...