EF操作扩展之async
EF的操作类网上很多类,我只是把我在平时项目中的类进行一些改进和扩展,扩展了部分同步和异步的EF操作
接口
/// <summary>
/// 接口数据操作基础类
/// </summary>
/// <typeparam name="Key"></typeparam>
/// <typeparam name="Entity"></typeparam>
public interface IBaseOpertion<TEntity, TKey> where TEntity : class
{
/// <summary>
/// 添加数据
/// </summary>
/// <param name="tableName"></param>
/// <param name="table"></param>
/// <returns></returns>
int AddTable(string tableName, DataTable table);
Task<int> AddTableAsy(string tableName, DataTable table);
/// <summary>
/// 添加
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
TEntity AddEntity(TEntity entity);
Task<TEntity> AddEntityAsy(TEntity entity);
/// <summary>
/// 批量添加
/// </summary>
/// <param name="list"></param>
/// <returns></returns>
int AddEntity(List<TEntity> list);
Task<int> AddEntityAys(List<TEntity> list);
/// <summary>
/// 修改
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
TEntity UpdateEntity(TEntity entity);
Task<TEntity> UpdateEntityAsy(TEntity entity);
/// <summary>
/// 删除 实体
/// </summary>
/// <param name="TEntity"></param>
/// <returns></returns>
int DelEntity(TEntity entity);
Task<int> DelEntityAsy(TEntity entity);
// <summary>
/// 删除 主键
/// </summary>
/// <param name="TEntity"></param>
/// <returns></returns>
int DelEntity(TKey key);
Task<int> DelEntityAsy(TKey key);
// <summary>
/// 删除 条件
/// </summary>
/// <param name="TEntity"></param>
/// <returns></returns>
int DelEntity(Dictionary<string,object> where);
Task<int> DelEntityAsy(Dictionary<string, object> where); /// <summary>
/// 根据ID进行查询
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
TEntity GetEntityByID(TKey key);
Task<TEntity> GetEntityByIDAsy(TKey key);
/// <summary>
/// 根据sql进行查询
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
List<TEntity> GetEntityQuerySql(string sql);
Task<List<TEntity>> GetEntityQuerySqlAsy(string sql);
/// <summary>
/// 根据条件进行查询
/// </summary>
/// <param name="fun"></param>
/// <returns></returns>
List<TEntity> GetEntityLisrByWhere(Expression<Func<TEntity, bool>> fun);
Task<List<TEntity>> GetEntityLisrByWhereAsy(Expression<Func<TEntity, bool>> fun); /// <summary>
/// 根据条件进行查询
/// </summary>
/// <param name="fun"></param>
/// <returns></returns>
TEntity GetEntityByWhere(Expression<Func<TEntity, bool>> fun);
Task<TEntity> GetEntityByWhereAsy(Expression<Func<TEntity, bool>> fun);
}
实现类
/// <summary>
/// 数据实体操作
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <typeparam name="TKey"></typeparam>
public abstract class BaseService<TEntity, TKey> : IBaseOpertion<TEntity, TKey> where TEntity : class
{
public virtual TEntity AddEntity(TEntity entity)
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
TEntity newEntity = dbHelper.Set<TEntity>().Add(entity);
if (dbHelper.SaveChanges() > )
return newEntity;
return null;
}
}
public virtual async Task<TEntity> AddEntityAsy(TEntity entity) {
using (DBContextHelper dbHelper = new DBContextHelper())
{
TEntity newEntity = dbHelper.Set<TEntity>().Add(entity);
int temp =await dbHelper.SaveChangesAsync();
if (temp > )
return newEntity;
return null;
}
} public virtual TEntity UpdateEntity(TEntity entity)
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
DbSet<TEntity> dbSet = dbHelper.Set<TEntity>();
DbEntityEntry<TEntity> entry = dbHelper.Entry<TEntity>(entity);
if (entry.State == System.Data.Entity.EntityState.Detached)
{
dbSet.Attach(entity);
entry.State = System.Data.Entity.EntityState.Modified;
}
if (dbHelper.SaveChanges() >= )
return entity;
return null;
}
}
public virtual async Task<TEntity> UpdateEntityAsy(TEntity entity)
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
DbSet<TEntity> dbSet = dbHelper.Set<TEntity>();
DbEntityEntry<TEntity> entry = dbHelper.Entry<TEntity>(entity);
if (entry.State == System.Data.Entity.EntityState.Detached)
{
dbSet.Attach(entity);
entry.State = System.Data.Entity.EntityState.Modified;
}
int result = await dbHelper.SaveChangesAsync();
if (result >= )
return entity;
return null;
}
} public virtual int DelEntity(TEntity entity)
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
dbHelper.Set<TEntity>().Remove(entity);
return dbHelper.SaveChanges();
}
}
public virtual async Task<int> DelEntityAsy(TEntity entity)
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
dbHelper.Set<TEntity>().Remove(entity);
return await dbHelper.SaveChangesAsync();
}
} public virtual TEntity GetEntityByID(TKey key)
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
var entity = dbHelper.Set<TEntity>().Find(key);
return entity;
}
}
public virtual async Task<TEntity> GetEntityByIDAsy(TKey key)
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
return await dbHelper.Set<TEntity>().FindAsync(key);
}
} public virtual List<TEntity> GetEntityQuerySql(string sql)
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
var entity = dbHelper.Set<TEntity>().SqlQuery(sql, new object[] { }).ToList();
return entity;
}
}
public virtual async Task<List<TEntity>> GetEntityQuerySqlAsy(string sql)
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
return await dbHelper.Set<TEntity>().SqlQuery(sql, new object[] { }).ToListAsync();
}
} public virtual List<TEntity> GetEntityLisrByWhere(Expression<Func<TEntity, bool>> fun)
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
var entity = dbHelper.Set<TEntity>().AsNoTracking().Where(fun).ToList();
return entity;
}
}
public virtual async Task<List<TEntity>> GetEntityLisrByWhereAsy(Expression<Func<TEntity, bool>> fun)
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
return await dbHelper.Set<TEntity>().AsNoTracking().Where(fun).ToListAsync();
}
} public virtual int AddEntity(List<TEntity> list)
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
dbHelper.Configuration.AutoDetectChangesEnabled = false;
try
{
dbHelper.Set<TEntity>().AddRange(list);
return dbHelper.SaveChanges();
}
finally
{
dbHelper.Configuration.AutoDetectChangesEnabled = true;
}
}
}
public virtual async Task<int> AddEntityAys(List<TEntity> list)
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
dbHelper.Configuration.AutoDetectChangesEnabled = false;
try
{
dbHelper.Set<TEntity>().AddRange(list);
return await dbHelper.SaveChangesAsync();
}
finally
{
dbHelper.Configuration.AutoDetectChangesEnabled = true;
}
}
} public virtual int DelEntity(TKey key)
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
var entity = dbHelper.Set<TEntity>().Find(key);
dbHelper.Set<TEntity>().Remove(entity);
return dbHelper.SaveChanges();
}
}
public virtual async Task<int> DelEntityAsy(TKey key)
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
var entity = dbHelper.Set<TEntity>().Find(key);
dbHelper.Set<TEntity>().Remove(entity);
return await dbHelper.SaveChangesAsync(); ;
}
} public virtual int DelEntity(Dictionary<string, object> where)
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
if (where == null || where.Keys.Count <= ) return ;
StringBuilder sb = new StringBuilder();
List<string> KeyList = new List<string>(where.Keys);
List<SqlParameter> plist = new List<SqlParameter>();
for (int i = , j = KeyList.Count; i < j; i++)
{
plist.Add(new SqlParameter()
{
ParameterName = KeyList[i],
Value = where[KeyList[i]]
});
if (i == j - )
{
sb.Append(string.Format(" {0}=@{0} ", KeyList[i]));
}
sb.Append(string.Format("{0}=@{0} and ", KeyList[i]));
}
string TableName = this.GetType().Name;
string sql = string.Format("delete from [{0}] where {1}", TableName, sb.ToString());
dbHelper.Set<TEntity>().SqlQuery(sql, plist);
return dbHelper.SaveChanges();
}
}
public virtual async Task<int> DelEntityAsy(Dictionary<string, object> where)
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
if (where == null || where.Keys.Count <= ) return ;
StringBuilder sb = new StringBuilder();
List<string> KeyList = new List<string>(where.Keys);
List<SqlParameter> plist = new List<SqlParameter>();
for (int i = , j = KeyList.Count; i < j; i++)
{
plist.Add(new SqlParameter()
{
ParameterName = KeyList[i],
Value = where[KeyList[i]]
});
if (i == j - )
{
sb.Append(string.Format(" {0}=@{0} ", KeyList[i]));
}
sb.Append(string.Format("{0}=@{0} and ", KeyList[i]));
}
string TableName = this.GetType().Name;
string sql = string.Format("delete from [{0}] where {1}", TableName, sb.ToString());
dbHelper.Set<TEntity>().SqlQuery(sql, plist);
return await dbHelper.SaveChangesAsync();
}
} public virtual TEntity GetEntityByWhere(Expression<Func<TEntity, bool>> fun)
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
var entity = dbHelper.Set<TEntity>().AsNoTracking().Where(fun).FirstOrDefault();
return entity;
}
}
public virtual async Task<TEntity> GetEntityByWhereAsy(Expression<Func<TEntity, bool>> fun)
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
return await dbHelper.Set<TEntity>().AsNoTracking().Where(fun).FirstOrDefaultAsync();
}
} public virtual int AddTable(string tableName, DataTable table)
{
if (string.IsNullOrEmpty(tableName) || table==null || table.Rows.Count<)
return -;
else
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
try
{
if (dbHelper.Database.Connection.State != ConnectionState.Open)
{
var bulkCopy = new SqlBulkCopy((SqlConnection)dbHelper.Database.Connection);
bulkCopy.DestinationTableName = tableName;
bulkCopy.WriteToServer(table);
}
return table.Rows.Count;
}
catch (Exception e)
{
throw e;
}
finally {
if (dbHelper.Database.Connection.State != ConnectionState.Closed)
{
dbHelper.Database.Connection.Close();
}
}
}
}
}
public virtual async Task<int> AddTableAsy(string tableName, DataTable table)
{
if (string.IsNullOrEmpty(tableName) || table == null || table.Rows.Count < )
return -;
else
{
using (DBContextHelper dbHelper = new DBContextHelper())
{
try
{
if (dbHelper.Database.Connection.State != ConnectionState.Open)
{
var bulkCopy = new SqlBulkCopy((SqlConnection)dbHelper.Database.Connection);
bulkCopy.DestinationTableName = tableName;
await bulkCopy.WriteToServerAsync(table);
}
return table.Rows.Count;
}
catch (Exception e)
{
throw e;
}
finally
{
if (dbHelper.Database.Connection.State != ConnectionState.Closed)
{
dbHelper.Database.Connection.Close();
}
}
}
}
}
}
EF操作扩展之async的更多相关文章
- EF操作MySql
EF的CodeFrist操作MySql的提前准备: 1.安装两个包:MySql.Data和MySql.Data.Entity,在VS中程序包管理器中添加2个包.(备注需要的VS2015,并且EF6支持 ...
- ASP.net如何保证EF操作类线程内唯一
说到线程内唯一,肯定会想到单例模式,但是如果多用户访问网站就会出现问题.ASP.net中有两种方法可以保证EF操作类线程内唯一(目前只会这两种,以后有好的方法再添加): 1.httpcontext(实 ...
- EF操作数据库的步骤和一些简单操作语句
这里是写给我自己做记录的,不会写成一篇很好的博客,也不会置顶,如果有朋友看到了,而且觉得里面的内容不咋的,希望见谅哈! 关于这部分内容,这里推荐一篇总结的非常好的博客,如果你点击进来了,那么请略过下面 ...
- EF操作与Linq写法记录
项目总结:EF操作与Linq写法记录 1.EF引入 新建一个MVC项目之后,要引用EF框架,可以按照以下步骤进行: 1),在Models中添加项目 2),选择Entity Data Model,并重新 ...
- 学习PHP中好玩的Gmagick图像操作扩展的使用
在 PHP 的图像处理领域,要说最出名的 GD 库为什么好,那就是因为它不需要额外安装的别的什么图像处理工具,而且是随 PHP 源码一起发布的,只需要在安装 PHP 的时候添加上编译参数就可以了. G ...
- .NetCore 使用 Linq 动态拼接Expression表达式条件来实现 对EF、EF Core 扩展查询排序操作
相信在使用EF的时候对查询条件或者排序上的处理令人心烦,下面我们就来动态拼接表达式解决这一问题 当我们在查询中使用Where的时候可以看到如下参数 下面我们就来扩展 Expression<Fun ...
- 采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)
前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这 ...
- EF架构~扩展一个分页处理大数据的方法
回到目录 最近总遇到大数据的问题,一次性处理几千万数据不实际,所以,我们需要对大数据进行分块处理,或者叫分页处理,我在EF架构里曾经写过类似的,那是在进行BulkInsert时,对大数据批量插入时候用 ...
- EntityFramework.Extended 对EF进行扩展
前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这 ...
随机推荐
- greenDAO简介
了解android开发的人应该都会知道,android的数据库开发主要用到sqlite.greenDAO应该算是当前最火的数据库开源框架了吧,它是一个移动开发的ORM(object / relatio ...
- swift新特性(__nullable和__nonnull
http://www.mamicode.com/info-detail-923593.html 最近在看老师写代码的时候经常遇到两个陌生的关键字,但是当我在我的电脑上敲得时候就是敲不出,后来才知道这是 ...
- 学习c++语言应该牢记的50条准则,同样学习其他语言也一样
1.把C++当成一门新的语言学习(和C没啥关系!真的.): 2.看<Thinking In C++>,不要看<C++变成死相>: 3.看<The C++ Programm ...
- iOS自定义字体及类目
1:获取字体文件 从各种渠道下载字体文件ttf, 网站或者从别的ipa里扣出来.(以fzltxh.ttf为例) 2:将fzltxh.ttf文件拷贝到工程中 3:在Info.plist中添加项: Fon ...
- TabLayout学习笔记
配合ViewPager使用,基本布局如下: <?xml version="1.0" encoding="utf-8"?> <LinearLay ...
- 安装了C
2014-04-09 13:19:30 大学里看的第一本编程书籍,就是C.但是一直没有编译. 今天首次安装,我也佩服当初我是怎么通过C二级的. 上午写了sds手册.其中的制图用的visio制图,非常好 ...
- c++中冒号(:)和双冒号(::)的用法(void文章::变乱()、子类:父类)
1.冒号(:)的用法 (1)表示机构内位域的定义(即该变量占几个bit空间) typedef struct _XXX{ unsigned char a:4; unsigned char c; } ; ...
- linux下简单限制网卡速度
Linux下限制网卡的带宽,可用来模拟服务器带宽耗尽,从而测试服务器在此时的访问效果. 1.安装iproute yum -y install iproute 2.限制eth0网卡的带宽为50kbit: ...
- Linux内存布局
在上一篇博文里,我们已经看到Linux如何有效地利用80x86的分段和分页硬件单元把逻辑地址转换为线性地址,在由线性地址转换到物理地址.那么我们的应用程序如何使用这些逻辑地址,整个内存的地址布局又是怎 ...
- 数据库基础-JOIN
JOIN分类 三.JOIN分类详解 INNER JOIN: 仅仅返回两个表中,匹配列相同的列值,所在行的数据. SELECT * FROM Table1 t1 INNER JOIN Table2 t2 ...