using System; using System.Linq; using System.Linq.Expressions; using Microsoft.EntityFrameworkCore; using detect.gui.Context; namespace detect.gui.Services; public class ServiceBase where S : new() where T : class { private static S? _instance; public static S Instance() { return _instance ??= new S(); } protected readonly DetectContext? Context = new DetectContext(); protected T Add(T entity) { Context!.Set().Add(entity); Context!.SaveChanges(); Context!.Entry(entity).State = EntityState.Detached; return entity; } public int Count(Expression> predicate) { return Context!.Set().Count(predicate); } protected bool Update(T entity) { Context!.Set().Update(entity); var r = Context!.SaveChanges() > 0; Context!.Entry(entity).State = EntityState.Detached; return r; } protected bool Delete(T entity) { Context!.Set().Remove(entity); var r = Context!.SaveChanges() > 0; Context!.Entry(entity).State = EntityState.Detached; return r; } protected void Delete(Expression> whereLambda) { var items = Context!.Set().Where(whereLambda).ToList(); foreach (var item in items) { Delete(item); } } public bool Exist(Expression> whereLambda) { return Context!.Set().Any(whereLambda); } protected T? Find(Expression> whereLambda) { var entity = Context!.Set().AsNoTracking().FirstOrDefault(whereLambda); return entity; } protected IQueryable FindList(Expression> whereLambda, string orderName, bool isAsc) { var items = Context!.Set().Where(whereLambda); items = OrderBy(items, orderName, isAsc).AsNoTracking(); return items; } protected IQueryable FindPageList(int pageIndex, int pageSize, out int totalRecord, Expression> whereLambda, string orderName, bool isAsc) { var items = Context!.Set().Where(whereLambda); totalRecord = items.Count(); items = OrderBy(items, orderName, isAsc).Skip((pageIndex - 1) * pageSize).Take(pageSize).AsNoTracking(); return items; } /// /// 排序 /// /// 类型 /// 原IQueryable /// 排序属性名 /// 是否正序 /// 排序后的IQueryable private static IQueryable OrderBy(IQueryable source, string propertyName, bool isAsc) { if (source == null) throw new ArgumentNullException(nameof(source), "不能为空"); if (string.IsNullOrEmpty(propertyName)) return source; var parameter = Expression.Parameter(source.ElementType); var property = Expression.Property(parameter, propertyName); if (property == null) throw new ArgumentNullException(nameof(propertyName), "属性不存在"); var lambda = Expression.Lambda(property, parameter); var methodName = isAsc ? "OrderBy" : "OrderByDescending"; var resultExpression = Expression.Call(typeof(Queryable), methodName, new[] { source.ElementType, property.Type }, source.Expression, Expression.Quote(lambda)); return source.Provider.CreateQuery(resultExpression); } }