You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
8.0 KiB
185 lines
8.0 KiB
using NFine.Code;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.Data.Common;
|
|
using System.Data.Entity;
|
|
using System.Data.Entity.Infrastructure;
|
|
using System.Linq;
|
|
using System.Linq.Expressions;
|
|
using System.Reflection;
|
|
using System.Text.RegularExpressions;
|
|
|
|
namespace NFine.Data
|
|
{
|
|
/// <summary>
|
|
/// 仓储实现
|
|
/// </summary>
|
|
public class RepositoryBase : IRepositoryBase, IDisposable
|
|
{
|
|
private NFineDbContext dbcontext = new NFineDbContext();
|
|
private DbTransaction dbTransaction { get; set; }
|
|
public IRepositoryBase BeginTrans()
|
|
{
|
|
DbConnection dbConnection = ((IObjectContextAdapter)dbcontext).ObjectContext.Connection;
|
|
if (dbConnection.State == ConnectionState.Closed)
|
|
{
|
|
dbConnection.Open();
|
|
}
|
|
dbTransaction = dbConnection.BeginTransaction();
|
|
return this;
|
|
}
|
|
public int Commit()
|
|
{
|
|
try
|
|
{
|
|
var returnValue = dbcontext.SaveChanges();
|
|
if (dbTransaction != null)
|
|
{
|
|
dbTransaction.Commit();
|
|
}
|
|
return returnValue;
|
|
}
|
|
catch (Exception)
|
|
{
|
|
if (dbTransaction != null)
|
|
{
|
|
this.dbTransaction.Rollback();
|
|
}
|
|
throw;
|
|
}
|
|
finally
|
|
{
|
|
this.Dispose();
|
|
}
|
|
}
|
|
public void Dispose()
|
|
{
|
|
if (dbTransaction != null)
|
|
{
|
|
this.dbTransaction.Dispose();
|
|
}
|
|
this.dbcontext.Dispose();
|
|
}
|
|
public int Insert<TEntity>(TEntity entity) where TEntity : class
|
|
{
|
|
dbcontext.Entry<TEntity>(entity).State = EntityState.Added;
|
|
return dbTransaction == null ? this.Commit() : 0;
|
|
}
|
|
public int Insert<TEntity>(List<TEntity> entitys) where TEntity : class
|
|
{
|
|
foreach (var entity in entitys)
|
|
{
|
|
dbcontext.Entry<TEntity>(entity).State = EntityState.Added;
|
|
}
|
|
return dbTransaction == null ? this.Commit() : 0;
|
|
}
|
|
public int Update<TEntity>(TEntity entity) where TEntity : class
|
|
{
|
|
dbcontext.Set<TEntity>().Attach(entity);
|
|
PropertyInfo[] props = entity.GetType().GetProperties();
|
|
foreach (PropertyInfo prop in props)
|
|
{
|
|
if (prop.GetValue(entity, null) != null)
|
|
{
|
|
if (prop.GetValue(entity, null).ToString() == " ")
|
|
dbcontext.Entry(entity).Property(prop.Name).CurrentValue = null;
|
|
dbcontext.Entry(entity).Property(prop.Name).IsModified = true;
|
|
}
|
|
}
|
|
return dbTransaction == null ? this.Commit() : 0;
|
|
}
|
|
public int Delete<TEntity>(TEntity entity) where TEntity : class
|
|
{
|
|
dbcontext.Set<TEntity>().Attach(entity);
|
|
dbcontext.Entry<TEntity>(entity).State = EntityState.Deleted;
|
|
return dbTransaction == null ? this.Commit() : 0;
|
|
}
|
|
public int Delete<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class
|
|
{
|
|
var entitys = dbcontext.Set<TEntity>().Where(predicate).ToList();
|
|
entitys.ForEach(m => dbcontext.Entry<TEntity>(m).State = EntityState.Deleted);
|
|
return dbTransaction == null ? this.Commit() : 0;
|
|
}
|
|
public TEntity FindEntity<TEntity>(object keyValue) where TEntity : class
|
|
{
|
|
return dbcontext.Set<TEntity>().Find(keyValue);
|
|
}
|
|
public TEntity FindEntity<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class
|
|
{
|
|
return dbcontext.Set<TEntity>().FirstOrDefault(predicate);
|
|
}
|
|
public IQueryable<TEntity> IQueryable<TEntity>() where TEntity : class
|
|
{
|
|
return dbcontext.Set<TEntity>();
|
|
}
|
|
public IQueryable<TEntity> IQueryable<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class
|
|
{
|
|
return dbcontext.Set<TEntity>().Where(predicate);
|
|
}
|
|
public List<TEntity> FindList<TEntity>(string strSql) where TEntity : class
|
|
{
|
|
return dbcontext.Database.SqlQuery<TEntity>(strSql).ToList<TEntity>();
|
|
}
|
|
public List<TEntity> FindList<TEntity>(string strSql, DbParameter[] dbParameter) where TEntity : class
|
|
{
|
|
return dbcontext.Database.SqlQuery<TEntity>(strSql, dbParameter).ToList<TEntity>();
|
|
}
|
|
public List<TEntity> FindList<TEntity>(Pagination pagination) where TEntity : class,new()
|
|
{
|
|
bool isAsc = pagination.sord.ToLower() == "asc" ? true : false;
|
|
string[] _order = pagination.sidx.Split(',');
|
|
MethodCallExpression resultExp = null;
|
|
var tempData = dbcontext.Set<TEntity>().AsQueryable();
|
|
foreach (string item in _order)
|
|
{
|
|
string _orderPart = item;
|
|
_orderPart = Regex.Replace(_orderPart, @"\s+", " ");
|
|
string[] _orderArry = _orderPart.Split(' ');
|
|
string _orderField = _orderArry[0];
|
|
bool sort = isAsc;
|
|
if (_orderArry.Length == 2)
|
|
{
|
|
isAsc = _orderArry[1].ToUpper() == "ASC" ? true : false;
|
|
}
|
|
var parameter = Expression.Parameter(typeof(TEntity), "t");
|
|
var property = typeof(TEntity).GetProperty(_orderField);
|
|
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
|
|
var orderByExp = Expression.Lambda(propertyAccess, parameter);
|
|
resultExp = Expression.Call(typeof(Queryable), isAsc ? "OrderBy" : "OrderByDescending", new Type[] { typeof(TEntity), property.PropertyType }, tempData.Expression, Expression.Quote(orderByExp));
|
|
}
|
|
tempData = tempData.Provider.CreateQuery<TEntity>(resultExp);
|
|
pagination.records = tempData.Count();
|
|
tempData = tempData.Skip<TEntity>(pagination.rows * (pagination.page - 1)).Take<TEntity>(pagination.rows).AsQueryable();
|
|
return tempData.ToList();
|
|
}
|
|
public List<TEntity> FindList<TEntity>(Expression<Func<TEntity, bool>> predicate, Pagination pagination) where TEntity : class,new()
|
|
{
|
|
bool isAsc = pagination.sord.ToLower() == "asc" ? true : false;
|
|
string[] _order = pagination.sidx.Split(',');
|
|
MethodCallExpression resultExp = null;
|
|
var tempData = dbcontext.Set<TEntity>().Where(predicate);
|
|
foreach (string item in _order)
|
|
{
|
|
string _orderPart = item;
|
|
_orderPart = Regex.Replace(_orderPart, @"\s+", " ");
|
|
string[] _orderArry = _orderPart.Split(' ');
|
|
string _orderField = _orderArry[0];
|
|
bool sort = isAsc;
|
|
if (_orderArry.Length == 2)
|
|
{
|
|
isAsc = _orderArry[1].ToUpper() == "ASC" ? true : false;
|
|
}
|
|
var parameter = Expression.Parameter(typeof(TEntity), "t");
|
|
var property = typeof(TEntity).GetProperty(_orderField);
|
|
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
|
|
var orderByExp = Expression.Lambda(propertyAccess, parameter);
|
|
resultExp = Expression.Call(typeof(Queryable), isAsc ? "OrderBy" : "OrderByDescending", new Type[] { typeof(TEntity), property.PropertyType }, tempData.Expression, Expression.Quote(orderByExp));
|
|
}
|
|
tempData = tempData.Provider.CreateQuery<TEntity>(resultExp);
|
|
pagination.records = tempData.Count();
|
|
tempData = tempData.Skip<TEntity>(pagination.rows * (pagination.page - 1)).Take<TEntity>(pagination.rows).AsQueryable();
|
|
return tempData.ToList();
|
|
}
|
|
}
|
|
}
|