EF RepositoryBase 参考示例【转】
1.定义泛型类
namespace Crm.Data.Logic.Repository
{
public abstract class AbstractRepository<TC, T> : IDisposable
where TC : DbContext, new()
where T : class
{
private TC _entities = new TC();
private bool _disposed;
protected TC Context
{
get
{
return _entities;
}
set
{
_entities = value;
}
}
public virtual IQueryable<T> All
{
get
{
return GetAll();
}
}
public virtual IQueryable<T> AllIncluding(params Expression<Func<T, object>>[] includeProperties)
{
IQueryable<T> queryable = _entities.Set<T>();
return includeProperties.Aggregate(queryable, (current, expression) => current.Include(expression));
}
public virtual IQueryable<T> GetAll()
{
return _entities.Set<T>();
}
public virtual T Find(params object[] keyValues)
{
return _entities.Set<T>().Find(keyValues);
}
public virtual IQueryable<T> FindBy(Expression<Func<T, bool>> predicate)
{
return _entities.Set<T>().Where(predicate);
}
public virtual void Add(T entity)
{
_entities.Set<T>().Add(entity);
}
public virtual void BulkInsert(List<T> list)
{
var tblName = typeof(T).Name;
BulkInsert(_entities.Database.Connection.ConnectionString, tblName, list);
}
public static void BulkInsert(string connection, string tableName, IList<T> list)
{
using (var bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.BatchSize = list.Count;
bulkCopy.DestinationTableName = tableName;
var table = new DataTable();
var props = TypeDescriptor.GetProperties(typeof(T))
//Dirty hack to make sure we only have system data types
//i.e. filter out the relationships/collections
.Cast<PropertyDescriptor>()
.Where(propertyInfo => propertyInfo.PropertyType.Namespace != null
&& propertyInfo.PropertyType.Namespace.Equals("System"))
.ToArray();
foreach (var propertyInfo in props)
{
bulkCopy.ColumnMappings.Add(propertyInfo.Name, propertyInfo.Name);
table.Columns.Add(propertyInfo.Name,
Nullable.GetUnderlyingType(propertyInfo.PropertyType) ??
propertyInfo.PropertyType);
}
var values = new object[props.Length];
foreach (var item in list)
{
for (var i = 0; i < values.Length; i++)
{
values[i] = props[i].GetValue(item);
}
table.Rows.Add(values);
}
bulkCopy.WriteToServer(table);
}
}
public virtual void Delete(T entity)
{
_entities.Set<T>().Remove(entity);
}
public virtual void Edit(T entity)
{
_entities.Entry(entity).State = (EntityState.Modified);
}
public virtual void Upsert(T entity, Func<T, bool> insertExpression)
{
if (insertExpression(entity))
{
Add(entity);
}
else
{
Edit(entity);
}
}
public virtual void Save()
{
_entities.SaveChanges();
}
public virtual DataTable PageQuery(int page, int pageSize,
string sort, string where, out int total)
{
var viewName = typeof (T).Name;
var paras = new List<SqlParameter>
{
new SqlParameter("tblName", "dbo."+viewName),
new SqlParameter("fldName", "*"),
new SqlParameter("pageSize", pageSize),
new SqlParameter("page", page),
new SqlParameter("fldSort", sort),
new SqlParameter("strCondition", where),
new SqlParameter("pageCount", SqlDbType.Int){Direction = ParameterDirection.Output},
};
var countParameter = new SqlParameter
{
ParameterName = "counts",
SqlDbType = SqlDbType.Int,
Direction = ParameterDirection.Output
};
var strParameter = new SqlParameter("strSql", SqlDbType.NVarChar, 4000) { Direction = ParameterDirection.Output };
paras.Add(countParameter);
paras.Add(strParameter);
var conn = _entities.Database.Connection.ConnectionString;
var ds = SqlHelper.ExecuteDataset(conn, CommandType.StoredProcedure,
"dbo.PagedQuery", paras.ToArray());
total = countParameter.Value == DBNull.Value ? 0 : Convert.ToInt32(countParameter.Value);
return ds.Tables[0];
}
public virtual List<T> PageQueryList(int page, int pageSize,
string sort, string where, out int total)
{
var viewName = typeof(T).Name;
var paras = new List<SqlParameter>
{
new SqlParameter("tblName", "dbo."+viewName),
new SqlParameter("fldName", "*"),
new SqlParameter("pageSize", pageSize),
new SqlParameter("page", page),
new SqlParameter("fldSort", sort),
new SqlParameter("strCondition", where),
new SqlParameter("pageCount", SqlDbType.Int){Direction = ParameterDirection.Output},
};
var countParameter = new SqlParameter
{
ParameterName = "counts",
SqlDbType = SqlDbType.Int,
Direction = ParameterDirection.Output
};
var strParameter = new SqlParameter("strSql", SqlDbType.NVarChar, 4000) { Direction = ParameterDirection.Output };
paras.Add(countParameter);
paras.Add(strParameter);
//var conn = _entities.Database.Connection.ConnectionString;
//var ds = SqlHelper.ExecuteDataset(conn, CommandType.StoredProcedure,
// "dbo.PagedQuery", paras.ToArray());
//total = countParameter.Value == DBNull.Value ? 0 : Convert.ToInt32(countParameter.Value);
var ret =_entities.Database.SqlQuery<T>(
"dbo.PagedQuery
@tblName,@fldName,@pageSize,@page,@fldSort,@strCondition,@pageCount
out,@counts out,@strSql out",
paras.ToArray()).ToList();
total = countParameter.Value == DBNull.Value ? 0 : Convert.ToInt32(countParameter.Value);
return ret;
}
protected virtual void Dispose(bool disposing)
{
if (!_disposed && disposing)
{
_entities.Dispose();
}
_disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
}
2. 具体类继承泛型类
namespace Crm.Data.Logic.Logic
{
public class CrmDispatchLogic:AbstractRepository<LifeEntities,Crm_Dispatch>
{
}
}
3. 使用具体类
var dispatchSvc = new CrmDispatchLogic();
var dispatchModel = dispatchSvc.GetAll().FirstOrDefault(m => m.Handler == opId
&& m.IsUse == 1);
if (dispatchModel != null)
{}
EF RepositoryBase 参考示例【转】的更多相关文章
- JavaEE参考示例 SpringSide 4.0 GA版杀青
SpringSide是以Spring Framework为核心的,Pragmatic风格的JavaEE应用参考示例,是JavaEE世界中的主流技术选型,较佳实践的总结与演示. 经过漫长的7个月和6个R ...
- 搜索应用参考示例XXL-SEARCH
<搜索应用参考示例XXL-SEARCH> 一.简介 1.1 概述 XXL-SEARCH 是以 "lucene/elasticsearch" 为核心的,Pragmatic ...
- Oracle数据库用EF操作的示例
Using EF Oracle Sample Provider with EDM Designer (from msdn) Many people are asking if it is possi ...
- DHTMLX地图开发参考示例摘录
1.新建地图:http://www.dhtmlx.com/docs/products/dhtmlxLayout/samples/04_components/12_gmaps.html 2.地图框架效果 ...
- as3.0服务端FMS软件常用的方法与属性参考示例
转自:http://www.cuplayer.com/player/PlayerCode/RTMP/2012/0918429.html Application类的方法汇总方法 描述Applicatio ...
- Nginx配置参数详解参考示例
user nobody; worker_processes 2; events{ worker_connections 1024; } http{ #设置默认类型为二进制流 default_type ...
- socket.io入门示例参考
参考示例地址:http://www.linchaoqun.com/html/cms/content.jsp?menu=nodejs&id=1480081169735
- 推荐几篇关于EF的好文章
文章作者 Julie Lerman 是 Microsoft MVP..NET 导师和顾问,住在佛蒙特州的山区.您可以在全球的用户组和会议中看到她对数据访问和其他 .NET 主题的演示.她的博客地址是 ...
- EasyUI+MVC+EF简单用户管理Demo(问题及解决)
写在前面 iframe-src EntityFramework版本 connectionStrings View.Action.页面跳转 EasyUI中DataGrid绑定 新增.修改和删除数据 效果 ...
随机推荐
- Modernizr.js介绍与使用
Modernizr帮助我们检测浏览器是否实现了某个feature,如果实现了那么开发人员就可以充分利用这个feature做一些工作,反之没有实现开发人员也好提供一个fallback.所以,我们要明白的 ...
- python函数的返回值 讲解
我们一起来聊聊python函数返回值的特殊情况,之前我也碰到过类似方面的问题,到后来查阅了一些资料后,发现原来是这样. 首先,写函数的时候,一定要写函数的文档,这样方便我们识别函数是做什么的.我记得很 ...
- SQL导入
然后将新窗口中所有内容放到你需要复制的那个数据库中->新建查询->修改第一行 USE[新数据库名]-> 运行这段代码->刷新数据库 基本就是选择源数据库和目标数据库,特别注意的 ...
- C#并行和多线程编程_(1)认识Parallel
Parallel: 英 [ˈpærəlel] 美 [ˈpærəˌlɛl] ,并联的,并行的. 随着多核时代的到来,并行开发越来越展示出它的强大威力!使用并行程序,充分的利用系统资源,提高程序的性 ...
- MVC-列表页操作按钮调用脚本
如上图所示功能:点击右边的“编辑”和“重置按钮”,调用js实现弹出框功能. 1.写脚本: <script type="text/javascript"> functio ...
- check whether the crystal report runtime is exists 检查crystalreport运行时是否存在
1. Try Dim rptDoc As New CrystalDecisions.CrystalReports.Engine.ReportClass() Dim rptView As New Cry ...
- Python创建list
Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> ['Mic ...
- cocos2dx输出信息重定向到控制台
重定向输出到控制台,方便调试,代码: // uncomment below line, open debug console #define USE_WIN32_CONSOLE int APIENTR ...
- 搭建 Win CE6.0 设备开发环境
1.操作系统最好基于Windows XP.Vista.Win7 或以上的版本对ActiveSync软件不支持 2.安装VS2008,以及SP1 (一定要装SP1) 3.安装ActiveSync 4. ...
- Tomacat服务器的安装和配置
一, Tomcat服务器的下载地址(Apache Tomcat的官网): http://tomcat.apache.org/download-70.cgi 这里为了稳定性安装的版本为7.0. 截止目 ...