/*******************************************************************************
* Copyright © 2020 WaterCloud.Framework 版权所有
* Author: WaterCloud
* Description: WaterCloud快速开发平台
* Website:
*********************************************************************************/
using Chloe;
using WaterCloud.Code;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Threading.Tasks;
namespace WaterCloud.DataBase
{
///
/// 仓储实现
///
///
public class RepositoryBase : IRepositoryBase where TEntity : class, new()
{
private IDbContext _context;
public IDbContext GetDbContext()
{
return _context;
}
public RepositoryBase(string ConnectStr, string providerName)
{
_context = DBContexHelper.Contex(ConnectStr, providerName);
}
public RepositoryBase(IDbContext context)
{
_context = context;
}
public async Task Insert(TEntity entity)
{
return await _context.InsertAsync(entity);
}
public async Task Insert(List entitys)
{
int i = 1;
await _context.InsertRangeAsync(entitys);
return i;
}
public async Task Update(TEntity entity)
{
//反射对比更新对象变更
TEntity newentity = _context.QueryByKey(entity);
_context.TrackEntity(newentity);
PropertyInfo[] newprops = newentity.GetType().GetProperties();
PropertyInfo[] props = entity.GetType().GetProperties();
foreach (PropertyInfo prop in props)
{
if (prop.GetValue(entity, null) != null)
{
PropertyInfo item = newprops.Where(a => a.Name == prop.Name).FirstOrDefault();
if (item != null)
{
item.SetValue(newentity, prop.GetValue(entity, null), null);
if (prop.GetValue(entity, null).ToString() == " ")
item.SetValue(newentity, null, null);
}
}
}
return await _context.UpdateAsync(newentity);
}
public async Task Update(Expression> predicate, Expression> content)
{
return await _context.UpdateAsync(predicate, content);
}
public async Task Delete(TEntity entity)
{
return await _context.DeleteAsync(entity);
}
public async Task Delete(Expression> predicate)
{
return await _context.DeleteAsync(predicate);
}
public async Task FindEntity(object keyValue)
{
return await _context.QueryByKeyAsync(keyValue);
}
public async Task FindEntity(Expression> predicate)
{
return _context.Query().FirstOrDefault(predicate);
}
public IQuery IQueryable()
{
return _context.Query();
}
public IQuery IQueryable(Expression> predicate)
{
return _context.Query().Where(predicate);
}
public async Task> FindList(string strSql)
{
return await _context.SqlQueryAsync(strSql);
}
public async Task> FindList(string strSql, DbParam[] dbParameter)
{
return await _context.SqlQueryAsync(strSql, dbParameter);
}
public async Task> FindList(Pagination pagination)
{
var tempData = _context.Query();
pagination.records = tempData.Count();
tempData = tempData.OrderBy(pagination.sort);
tempData = tempData.TakePage(pagination.page, pagination.rows);
return tempData.ToList();
}
public async Task> FindList(Expression> predicate, Pagination pagination)
{
var tempData = _context.Query().Where(predicate);
pagination.records = tempData.Count();
tempData = tempData.OrderBy(pagination.sort);
tempData = tempData.TakePage(pagination.page, pagination.rows);
return tempData.ToList();
}
public async Task> OrderList(IQuery query, Pagination pagination)
{
var tempData = query;
pagination.records = tempData.Count();
tempData = tempData.OrderBy(pagination.sort);
tempData = tempData.TakePage(pagination.page, pagination.rows);
return tempData.ToList();
}
public async Task> OrderList(IQuery query, SoulPage pagination)
{
var tempData = query;
List filterSos = pagination.getFilterSos();
if (filterSos!=null && filterSos.Count>0)
{
tempData = tempData.GenerateFilter("u", filterSos);
}
pagination.count = tempData.Count();
if (pagination.order == "desc")
{
tempData = tempData.OrderBy(pagination.field + " " + pagination.order);
}
else
{
tempData = tempData.OrderBy(pagination.field);
}
tempData = tempData.TakePage(pagination.page, pagination.rows);
return tempData.ToList();
}
public async Task> CheckCacheList(string cacheKey, long old = 0)
{
var cachedata =await CacheHelper.Get>(cacheKey);
if (cachedata == null || cachedata.Count() == 0)
{
cachedata = _context.Query().ToList();
await CacheHelper.Set(cacheKey, cachedata);
}
return cachedata;
}
public async Task CheckCache(string cacheKey, object keyValue, long old = 0)
{
var cachedata = await CacheHelper.Get(cacheKey + keyValue);
if (cachedata == null)
{
cachedata = await _context.QueryByKeyAsync(keyValue);
if (cachedata != null)
{
await CacheHelper.Set(cacheKey + keyValue, cachedata);
}
}
return cachedata;
}
}
}