/// <summary> /// ctor /// </summary> /// <param name="innerDataProvider"></param> public ModelDataService(EFAuditDataService <TEntity> innerDataProvider) { _innerDataProvider = innerDataProvider; _dataMapper = new LangDataMapper <TModel, TEntity>(); _entityRule = ModelRule.Get <TEntity>(); _modelRule = ModelRule.Get <TModel>(); }
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); }
public void Dispose() { if (_innerDataProvider != null) { _innerDataProvider.Dispose(); _innerDataProvider = null; } }
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()); }
/// <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); }
public void TestLangCollectionsWrite() { Sys_DataLanguage lang = new Sys_DataLanguage() { Language = "en-us", BillId = 3, Name = "NoName", Text = "Hello", BillType = "NoTypeName" }; EFAuditDataService <Sys_DataLanguage> langWriter = new EFAuditDataService <Sys_DataLanguage>(new LangContext()); int i = langWriter.Add(lang); Assert.AreEqual(i, 1); }
/// <summary> /// 保存岗位数据 /// </summary> /// <param name="postModelList"></param> /// <returns></returns> public bool SavePostInfo(List <PostModel> postModelList) { var _context = SiteManager.Kernel.Get <ModelContext>(); EFAuditDataService <PostModel> efMain = new EFAuditDataService <PostModel>(_context); try { int row = 0; #region 岗位信息 foreach (PostModel item in postModelList) { if (item._State.ToUpper() == "ADDED") { row = efMain.Add(item); } else if (item._State.ToUpper() == "MODIFIED") { row = efMain.Change(item); } else if (item._State.ToUpper() == "REMOVED") { row = efMain.Delete(item); } if (row < 0) { efMain.RollbackTrans(); return(false); } } #endregion } catch (Exception) { efMain.RollbackTrans(); throw; } efMain.EndTrans(); return(true); }
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="dataService">当前的数据服务</param> /// <param name="e">数据实体对象</param> /// <param name="t">业务实体对象</param> public void SaveLanguages(EFAuditDataService <TEntity> dataService, TEntity e, TModel t) { var me = e as IMultiLanguage; if (me == null) { return; } ModelRule modelRule = ModelRule.Get <TModel>(); string entityType = typeof(TEntity).Name; var langs = ResHelper.GetUsedCultureNames().Select(l => l.ToLower()).ToArray(); if (me.LangTexts == null) { me.LangTexts = dataService.GetContext().Set <Sys_DataLanguage>().Where(d => d.BillId == e.Id && d.BillType == entityType).ToList(); } var sysLangs = me.LangTexts; foreach (var rule in modelRule.SingleRules.Where(r => r.DataType == ExtDataType.MultiLanguage)) { //先处理主文本框name不带语言后缀的表单值,表示是当前语言 string langVal = HttpContext.Current.Request.Form[rule.Name]; string currentLang = ResHelper.CurrentCultureName.ToLower(); var langEntity = sysLangs.FirstOrDefault(l => l.Language == currentLang); if (langEntity == null) { langEntity = new Sys_DataLanguage { BillId = e.Id, BillType = entityType, Language = currentLang, Name = rule.Name, Text = langVal }; dataService.MarkState(langEntity, EntityState.Added); } else if (langVal != langEntity.Text) { langEntity.Text = langVal; dataService.MarkState(langEntity, EntityState.Modified); } RefHelper.SetValue(e, rule.Name, langVal); //再处理下拉列表中的文本框name带语言后缀的表单值 foreach (var lang in langs.Where(l => l != currentLang)) { langVal = HttpContext.Current.Request.Form[rule.Name + "-" + lang]; langEntity = sysLangs.FirstOrDefault(l => l.Language == lang); if (langEntity == null) { langEntity = new Sys_DataLanguage { BillId = e.Id, BillType = entityType, Language = lang, Name = rule.Name, Text = langVal }; dataService.MarkState(langEntity, EntityState.Added); } else if (langVal != langEntity.Text) { langEntity.Text = langVal; dataService.MarkState(langEntity, EntityState.Modified); } } } }
/// <summary> /// ctor /// </summary> /// <param name="dataProvider">数据提供者</param> public MasterGridController(EFAuditDataService <T> dataProvider) { _dataProvider = dataProvider; }
/// <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); }
public void EFTestMultiObjectAddOrChange() { var context = new TestContext(); Random rand = new Random(100); /////////////////////////////添加供应商/////////////////////////////////////// List <Supplier> suppliers = new List <Supplier>(); string prefix = DateTime.Now.ToString("yyMMddHHmmss"); for (int i = 0; i < 100; i++) { suppliers.Add(new Supplier { Name = "Supplier" + prefix + i, Address = "Address" + prefix + i, Tel = "12345" + prefix + i, }); } EFAuditDataService <Supplier> supplierProvider = new EFAuditDataService <Supplier>(context); var count = supplierProvider.Add(suppliers); Assert.AreEqual(count, suppliers.Count); /////////////////////////////添加产品/////////////////////////////////////// List <Product> products = new List <Product>(); for (int i = 0; i < 1000; i++) { products.Add(new Product { Name = "Product" + prefix + i, Model = "Model" + prefix + i, Price = DateTime.Now.Millisecond, Unit = DateTime.Now.Second, }); } EFAuditDataService <Product> productProvider = new EFAuditDataService <Product>(context); count = productProvider.Add(products); Assert.AreEqual(count, products.Count); /////////////////////////////添加服务/////////////////////////////////////// List <Service> services = new List <Service>(); for (int i = 0; i < 200; i++) { services.Add(new Service { Name = "Service" + prefix + i, ServiceType = "Type" + prefix + i, Price = DateTime.Now.Millisecond, }); } EFAuditDataService <Service> serviceProvider = new EFAuditDataService <Service>(context); count = serviceProvider.Add(services); Assert.AreEqual(count, services.Count); services.ForEach(svc => svc.Price *= 1.2m); //测试批量修改 count = serviceProvider.Change(services); Assert.AreEqual(count, services.Count); /////////////////////////////添加订单/////////////////////////////////////// List <Order> orders = new List <Order>(); for (int i = 0; i < 50; i++) { var order = new Order { Name = "Order" + prefix + i, SupplierId = suppliers[rand.Next(suppliers.Count)].Id, }; order.Details = new List <OrderDetail>(); for (int j = 0; j < rand.Next(10); j++) { order.Details.Add(new OrderDetail { Order = order, Product = products[rand.Next(products.Count)], Quantity = rand.Next(10), }); } order.Amount = order.Details.Sum(detail => detail.Quantity * detail.Product.Price); orders.Add(order); } EFAuditDataService <Order> orderProvider = new EFAuditDataService <Order>(context); orderProvider.Add(orders); /////////////////////////////添加服务合同/////////////////////////////////////// List <Contract> contracts = new List <Contract>(); for (int i = 0; i < 20; i++) { var service = services[rand.Next(services.Count)]; contracts.Add(new Contract { Service = service, Name = "ServiceContract" + prefix + i, SupplierId = suppliers[rand.Next(suppliers.Count)].Id, Amount = service.Price * 0.9m, }); } EFAuditDataService <Contract> contractProvider = new EFAuditDataService <Contract>(context); count = contractProvider.Add(contracts); Assert.AreEqual(count, contracts.Count); }