/// <summary> /// 返回业务模型对象全部的结果查询表达式 /// </summary> /// <returns></returns> public virtual IQueryable <TModel> GetQuery() { IQueryable <TEntity> query = _innerDataProvider.GetQuery(); if (typeof(MultiLanguage).IsAssignableFrom(typeof(TEntity))) { query = query.Include("LangTexts"); } //如果实现逻辑删除接口,并且没有改写EFAuditDataSerice,则在此加条件 if (typeof(ICanLogicalDeleteEntity).IsAssignableFrom(typeof(TEntity)) && _innerDataProvider.GetType() == typeof(EFAuditDataService <TEntity>)) { query = query.Where("IsDeleted=false"); } if (typeof(IDataRule).IsAssignableFrom(typeof(TEntity))) { var context = _innerDataProvider.GetContext(); var userId = AppManager.Instance.GetCurrentUserId().ToInt(); query = query.Where(t => context.Set <Sys_DataRule>().Any(dr => dr.BillId == t.Id && dr.ObjectId == userId)); } var langMapper = new LangDataMapper <TModel, TEntity>(); var duQuery = new DeptUserAuthQuery <TModel>(); return(duQuery.GetQuery(query.ProjectTo <TModel>())); }
public void EFTestMultiTableQuery() { //需求:查找所有供应商的产品和服务的总价,同一供应商的产品总价和服务总价作对比。 // 格式: // 供应商名称 订单产品总价 合同服务总价 // XXXXX 12000 11000 // ... ... ... //两个条件: //1. 不能遗漏订单或合同统计两者之一不为0的供应商 //2. 不能留下即没有订单又没有合同的供应商 // 此示例比较复杂,相对简单一点的示例,请参见msdn: // https://msdn.microsoft.com/zh-cn/library/bb311040(v=vs.100).aspx var context = new TestContext(); var supplierProvider = new EFAuditDataService <Supplier>(context); //如果没有数据,则调用一下新增数据的方法 if (supplierProvider.GetQuery().Count() == 0) { EFTestMultiObjectAddOrChange(); } var orderProvider = new EFAuditDataService <Order>(context); var contractProvider = new EFAuditDataService <Contract>(context); var result = from s in supplierProvider.GetQuery() join o in orderProvider.GetQuery() .GroupBy(op => op.SupplierId) .Select(g => new { SupplierId = g.Key, OrderAmount = g.Sum(order => order.Amount) }) on s.Id equals o.SupplierId into orderGroup from item1 in orderGroup.DefaultIfEmpty() join c in contractProvider.GetQuery().GroupBy(op => op.SupplierId) .Select(g => new { SupplierId = g.Key, ContractAmount = g.Sum(contract => contract.Amount) }) on s.Id equals c.SupplierId into contractGroup from item2 in contractGroup.DefaultIfEmpty() select new { SupplierName = s.Name, OrderAmount = item1 == null ? 0 : item1.OrderAmount, ContractAmount = item2 == null ? 0 : item2.ContractAmount }; //为了清楚起见,这个查询可以分开写,但最终提交到数据库是单条SQL语句。 // 注意在查询的变换过程中,中间不要ToList()。 // 最后的结果如果要分页,也不要ToList() result = result.Where(a => a.OrderAmount > 0 || a.ContractAmount > 0); //using Jurassic.Com.Tools 后,还可以这样写: //result = result.Where("OrderAmount>0 OR ContractAmount>0"); Debug.WriteLine("SupplierName\t\tOrderAmount\t\tContractAmount"); foreach (var r in result) { Debug.WriteLine(r.SupplierName + "\t\t" + r.OrderAmount + "\t\t" + r.ContractAmount); } Debug.WriteLine("----------------Count=" + result.Count()); }
public void TestParseIntArray() { var list = new List <int> { 1, 2, 3 }; var pOrder = Expression.Parameter(typeof(Order), "order"); MemberExpression mOrderId = Expression.Property(pOrder, "Id"); var constList = Expression.Constant(list, typeof(List <int>)); MethodInfo containsMethod = typeof(List <int>).GetMethod("Contains"); var filter = Expression.Call(constList, containsMethod, mOrderId); var lambda = Expression.Lambda <Func <Order, bool> >(filter, pOrder); var context = new TestContext(); EFAuditDataService <Order> orderProvider = new EFAuditDataService <Order>(context); var query = orderProvider.GetQuery() //.Where(order=>list.Contains(order.Id)); .Where(lambda); int count = query.Count(); Assert.IsTrue(count > 0); }
/// <summary> /// 删除 /// </summary> /// <param name="authTokenModel">数据节点对象</param> /// <returns></returns> public bool Delete(DepartmentModel organizationModel) { var _context = SiteManager.Kernel.Get <ModelContext>(); EFAuditDataService <DepartmentModel> efMain = new EFAuditDataService <DepartmentModel>(_context); EFAuditDataService <DepPostModel> efPost = new EFAuditDataService <DepPostModel>(_context); EFAuditDataService <DepUserModel> efUser = new EFAuditDataService <DepUserModel>(_context); try { int row = 0; #region 组织机构与岗位信息 List <DepPostModel> postList = efPost.GetQuery().Where(p => p.DepId == organizationModel.Id).ToList(); foreach (DepPostModel item in postList) { row = efPost.Delete(item); if (row < 0) { efMain.RollbackTrans(); return(false); } } #endregion #region 组织机构与用户信息 List <DepUserModel> userList = efUser.GetQuery().Where(p => p.DepId == organizationModel.Id).ToList(); foreach (DepUserModel item in userList) { row = efUser.Delete(item); if (row < 0) { efMain.RollbackTrans(); return(false); } } #endregion #region 组织机构主表数据 row = efMain.Delete(organizationModel); if (row < 0) { efMain.RollbackTrans(); return(false); } #endregion } catch (Exception) { efMain.RollbackTrans(); throw; } efMain.EndTrans(); return(true); }
/// <summary> /// 验证该岗位是否存在引用关系 /// 岗位与部门表 /// 岗位与部门人员表 /// </summary> /// <returns>true 没有引用关系 false 有引用关系</returns> public bool IsNotLinkPost(PostModel postModel) { var _context = SiteManager.Kernel.Get <ModelContext>(); EFAuditDataService <DepPostModel> efPost = new EFAuditDataService <DepPostModel>(_context); EFAuditDataService <DepUserModel> efUser = new EFAuditDataService <DepUserModel>(_context); List <DepPostModel> postLsit = efPost.GetQuery().Where(u => u.IsDeleted == 0 && u.PostId == postModel.Id).ToList(); List <DepUserModel> userLsit = efUser.GetQuery().Where(u => u.IsDeleted == 0 && u.PostId == postModel.Id).ToList(); if (!postLsit.Any() && !userLsit.Any()) { return(true); } return(false); }
/// <summary> /// 返回一个分页的文章列表 /// </summary> /// <param name="pageModel">从视图传过来的分页数据对象</param> /// <returns></returns> public virtual ActionResult Index(PageModel pageModel) { pageModel.CatalogId = CatalogId; key = pageModel.Key; if (pageModel.PageSize <= 5) { pageModel.PageSize = 5; } BeforeGetPageData(pageModel); if (pageModel.SortField.IsEmpty()) { pageModel.SortField = "Id"; pageModel.SortOrder = "DESC"; } var pager = new Pager <T>(_dataProvider.GetQuery(), pageModel.PageIndex, pageModel.PageSize); AfterGetPageData(pager); return(View(pager)); }
public void TestLangCollectionsRead() { //SiteManager.Kernel.Bind<IModelEntityConverter<TestLangTableModel, TestLangTable>>().To<LangTableConveter>(); //Mapper.CreateMap<TestLangTable, TestLangTableModel>().ForMember(d => d.Remark, opt => opt.MapFrom(s => "RemarkTest")); var service = new EFAuditDataService <TestLangTable>(new LangContext()); var query = service.GetQuery().Where(t => t.LangTexts.Count > 0); int count = query.Count(); var list = query.Include("LangTexts").ToList(); //Assert.IsTrue(list.Count > 0); Assert.AreEqual(count, 2); var service2 = new EFAuditDataService <TestLangTable2>(new LangContext()); var query2 = service2.GetQuery().Where(t => t.LangTexts.Count > 0); int count2 = query2.Count(); Assert.AreEqual(count, 2); //ModelDataService<TestLangTableModel, TestLangTable> langService2 = new ModelDataService<TestLangTableModel, TestLangTable>(new EFAuditDataService<TestLangTable>(new LangContext())); //var query2 = langService2.GetQuery().Where(t => t.Name == "王"); //int count2 = query2.Count(); //Assert.IsTrue(count2 == 0); }
/// <summary> /// 保存 /// </summary> /// <param name="authTokenModel">数据节点对象</param> /// <returns></returns> public bool SaveInfo(DepartmentModel organizationModel) { var _context = SiteManager.Kernel.Get <ModelContext>(); EFAuditDataService <DepartmentModel> efMain = new EFAuditDataService <DepartmentModel>(_context); EFAuditDataService <DepPostModel> efPost = new EFAuditDataService <DepPostModel>(_context); EFAuditDataService <DepUserModel> efUser = new EFAuditDataService <DepUserModel>(_context); try { #region 组织机构主表数据 efMain.BeginTrans(); int row = 0; if (organizationModel.Id == null || organizationModel.Id <= 0) { row = efMain.Add(organizationModel); } else { row = efMain.Change(organizationModel); } if (row < 0) { efMain.RollbackTrans(); return(false); } #endregion #region 组织机构与岗位信息 foreach (DepPostModel item in organizationModel.DepPostModelList) { item.DepId = organizationModel.Id; item.IsActive = 1; item.ExamineType = ""; item.IsDeleted = 0; item.IsDisabled = 0; item.Name = ""; item.CreateDatetime = DateTime.Now; if (item._State.ToUpper() == "ADDED") { row = efPost.Add(item); } else if (item._State.ToUpper() == "MODIFIED") { row = efPost.Change(item); } else if (item._State.ToUpper() == "REMOVED") { row = efPost.Delete(item); } if (row < 0) { efMain.RollbackTrans(); return(false); } } #endregion #region 组织机构与用户信息 foreach (DepUserModel item in organizationModel.DepUserModelList) { #region 设置用户的主部门,清除已存在其他主部门标识,确定一个用户只有一个主要部门 //如果某个用户设置了主部门首先查询是否在其他部门下已经存在设置,如果存在清除掉,重新写入主部门标识 if (item.IsMain == 1) { List <DepUserModel> dList = efUser.GetQuery().Where(u => u.UserName == item.UserName && u.DepId != item.DepId).ToList(); foreach (DepUserModel m in dList) { m.IsMain = 0; row = efUser.Change(m); if (row < 0) { efMain.RollbackTrans(); return(false); } } } #endregion item.DepId = organizationModel.Id; item.ContractLenght = item.ContractLenght == null ? 0 : item.ContractLenght; item.ExamineType = ""; item.IsDeleted = 0; item.JoinDateTime = item.JoinDateTime == null ? DateTime.Now : item.JoinDateTime; item.IsSuspension = item.IsSuspension == null ? 0 : item.ContractLenght; item.IsLeader = item.IsLeader == null ? 0 : item.IsLeader; item.IsMain = item.IsMain == null ? 0 : item.IsMain; item.CreateDatetime = DateTime.Now; if (item._State.ToUpper() == "ADDED") { row = efUser.Add(item); } else if (item._State.ToUpper() == "MODIFIED") { row = efUser.Change(item); } else if (item._State.ToUpper() == "REMOVED") { row = efUser.Delete(item); } if (row < 0) { efMain.RollbackTrans(); return(false); } } #endregion } catch (Exception) { efMain.RollbackTrans(); throw; } efMain.EndTrans(); return(true); }