From 50d8199d4e83db01e376a8875b3307323029d2ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=9F=B3=E5=A4=B4?= Date: Thu, 14 Mar 2024 21:42:05 +0800 Subject: [PATCH] =?UTF-8?q?[fix]=20=E4=BF=AE=E6=AD=A3=E7=89=B9=E6=AE=8A?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=90=8D=E7=9A=84=E6=94=AF=E6=8C=81=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E3=80=82fix=20https://github.com/NewLifeX/NewLife.XCo?= =?UTF-8?q?de/issues/24?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- XCode/DataAccessLayer/DAL.cs | 4 +- XCode/DataAccessLayer/Model/IModelResolver.cs | 2 +- XCode/DataAccessLayer/Model/ModelHelper.cs | 11 +- XUnitTest.XCode/Model/City.xml | 2 +- XUnitTest.XCode/Model/Code/entity_city.cs | 350 ++++++++++++++++++ XUnitTest.XCode/Model/Code/entity_city_biz.cs | 223 +++++++++++ XUnitTest.XCode/Model/ModelHelperTests.cs | 57 ++- XUnitTest.XCode/XUnitTest.XCode.csproj | 6 + 8 files changed, 646 insertions(+), 9 deletions(-) create mode 100644 XUnitTest.XCode/Model/Code/entity_city.cs create mode 100644 XUnitTest.XCode/Model/Code/entity_city_biz.cs diff --git a/XCode/DataAccessLayer/DAL.cs b/XCode/DataAccessLayer/DAL.cs index 15dd97fce..c7e110edc 100644 --- a/XCode/DataAccessLayer/DAL.cs +++ b/XCode/DataAccessLayer/DAL.cs @@ -668,10 +668,10 @@ public static IList Import(String xml) /// public static IList ImportFrom(String xmlFile) { - if (xmlFile.IsNullOrEmpty()) return new IDataTable[0]; + if (xmlFile.IsNullOrEmpty()) return []; xmlFile = xmlFile.GetFullPath(); - if (!File.Exists(xmlFile)) return new IDataTable[0]; + if (!File.Exists(xmlFile)) return []; return ModelHelper.FromXml(File.ReadAllText(xmlFile), CreateTable); } diff --git a/XCode/DataAccessLayer/Model/IModelResolver.cs b/XCode/DataAccessLayer/Model/IModelResolver.cs index 8ba4238ae..addddc01d 100755 --- a/XCode/DataAccessLayer/Model/IModelResolver.cs +++ b/XCode/DataAccessLayer/Model/IModelResolver.cs @@ -297,7 +297,7 @@ public virtual IDataColumn Fix(IDataColumn column) if (column.Table == null || !column.Table.Columns.Any(e => e.Name.EqualIgnoreCase(name))) column.Name = name; else - column.Name = column.Name; + column.Name = column.ColumnName; } return column; diff --git a/XCode/DataAccessLayer/Model/ModelHelper.cs b/XCode/DataAccessLayer/Model/ModelHelper.cs index 59d1771cd..58d466d48 100644 --- a/XCode/DataAccessLayer/Model/ModelHelper.cs +++ b/XCode/DataAccessLayer/Model/ModelHelper.cs @@ -29,7 +29,7 @@ public static class ModelHelper /// public static IDataColumn[] GetColumns(this IDataTable table, String[] names) { - if (names == null || names.Length <= 0) return new IDataColumn[0]; + if (names == null || names.Length <= 0) return []; //return table.Columns.Where(c => names.Any(n => c.Is(n))).ToArray(); var dcs = new List(); @@ -148,6 +148,9 @@ public static List GetAllColumns(this IDataTable table, IEnumerable public static String CamelName(this IDataColumn column) { var name = column.Name; + if (name.IsNullOrEmpty()) name = column.ColumnName; + if (name.IsNullOrEmpty()) return name; + if (name.EqualIgnoreCase("id")) return "id"; // 全小写,直接返回 @@ -258,7 +261,7 @@ public static String ToXml(IEnumerable tables, Object? option = null /// public static IList FromXml(String xml, Func createTable, Object? option = null, IDictionary? atts = null) { - if (xml.IsNullOrEmpty()) return new IDataTable[0]; + if (xml.IsNullOrEmpty()) return []; if (createTable == null) throw new ArgumentNullException(nameof(createTable)); var settings = new XmlReaderSettings @@ -342,7 +345,7 @@ public static IList FromXml(String xml, Func createTable static void ReadTable(XmlReader reader, Func createTable, IList list) { var table = createTable(); - (table as IXmlSerializable).ReadXml(reader); + (table as IXmlSerializable)!.ReadXml(reader); // 判断是否存在属性NeedHistory设置且为true var needHistory = table.Properties.FirstOrDefault(x => x.Key.EqualIgnoreCase("NeedHistory")); @@ -592,7 +595,7 @@ public static void ReadXmlAttribute(XmlReader reader, Object value) if (dc.Table == null || !dc.Table.Columns.Any(e => e.Name.EqualIgnoreCase(name))) dc.Name = name; else - dc.Name = dc.Name; + dc.Name = dc.ColumnName; } } //reader.Skip(); diff --git a/XUnitTest.XCode/Model/City.xml b/XUnitTest.XCode/Model/City.xml index aff93f96b..6ae5856db 100644 --- a/XUnitTest.XCode/Model/City.xml +++ b/XUnitTest.XCode/Model/City.xml @@ -9,7 +9,7 @@ - + diff --git a/XUnitTest.XCode/Model/Code/entity_city.cs b/XUnitTest.XCode/Model/Code/entity_city.cs new file mode 100644 index 000000000..2066648ab --- /dev/null +++ b/XUnitTest.XCode/Model/Code/entity_city.cs @@ -0,0 +1,350 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Runtime.Serialization; +using System.Web.Script.Serialization; +using System.Xml.Serialization; +using NewLife; +using NewLife.Data; +using XCode; +using XCode.Cache; +using XCode.Configuration; +using XCode.DataAccessLayer; + +namespace Company.MyName; + +/// 居民信息 +[Serializable] +[DataObject] +[Description("居民信息")] +[BindIndex("CreditNoPName", true, "Pname,CreditNo")] +[BindIndex("Build_IDIndex", false, "Build_ID")] +[BindIndex("BuildIDIndex", false, "BuildID")] +[BindTable("core_person", Description = "居民信息", ConnName = "MyConn", DbType = DatabaseType.MySql)] +public partial class CorePerson +{ + #region 属性 + private Int32 _PersonID; + /// 编号 + [DisplayName("编号")] + [Description("编号")] + [DataObjectField(true, true, false, 0)] + [BindColumn("PersonID", "编号", "int(11)")] + public Int32 PersonID { get => _PersonID; set { if (OnPropertyChanging("PersonID", value)) { _PersonID = value; OnPropertyChanged("PersonID"); } } } + + private String? _Pname; + /// 姓名 + [DisplayName("姓名")] + [Description("姓名")] + [DataObjectField(false, false, true, 50)] + [BindColumn("Pname", "姓名", "varchar(50)")] + public String? Pname { get => _Pname; set { if (OnPropertyChanging("Pname", value)) { _Pname = value; OnPropertyChanged("Pname"); } } } + + private Int32 _Psex; + /// 性别 + [DisplayName("性别")] + [Description("性别")] + [DataObjectField(false, false, true, 0)] + [BindColumn("Psex", "性别", "int(11)")] + public Int32 Psex { get => _Psex; set { if (OnPropertyChanging("Psex", value)) { _Psex = value; OnPropertyChanged("Psex"); } } } + + private String? _CreditNo; + /// 身份证号 + [DisplayName("身份证号")] + [Description("身份证号")] + [DataObjectField(false, false, true, 50)] + [BindColumn("CreditNo", "身份证号", "char(50)")] + public String? CreditNo { get => _CreditNo; set { if (OnPropertyChanging("CreditNo", value)) { _CreditNo = value; OnPropertyChanged("CreditNo"); } } } + + private String? _Mobile; + /// 联系电话 + [DisplayName("联系电话")] + [Description("联系电话")] + [DataObjectField(false, false, true, 50)] + [BindColumn("Mobile", "联系电话", "char(50)")] + public String? Mobile { get => _Mobile; set { if (OnPropertyChanging("Mobile", value)) { _Mobile = value; OnPropertyChanged("Mobile"); } } } + + private Int32 _BuildID; + /// 楼宇ID + [DisplayName("楼宇ID")] + [Description("楼宇ID")] + [DataObjectField(false, false, true, 0)] + [BindColumn("BuildID", "楼宇ID", "int(11)")] + public Int32 BuildID { get => _BuildID; set { if (OnPropertyChanging("BuildID", value)) { _BuildID = value; OnPropertyChanged("BuildID"); } } } + + private Int32 _Build_ID; + /// 平台楼号 + [DisplayName("平台楼号")] + [Description("平台楼号")] + [DataObjectField(false, false, true, 0)] + [BindColumn("Build_ID", "平台楼号", "int(11)")] + public Int32 Build_ID { get => _Build_ID; set { if (OnPropertyChanging("Build_ID", value)) { _Build_ID = value; OnPropertyChanged("Build_ID"); } } } + + private String? _UnitNum; + /// 单元号 + [DisplayName("单元号")] + [Description("单元号")] + [DataObjectField(false, false, true, 20)] + [BindColumn("UnitNum", "单元号", "varchar(20)")] + public String? UnitNum { get => _UnitNum; set { if (OnPropertyChanging("UnitNum", value)) { _UnitNum = value; OnPropertyChanged("UnitNum"); } } } + + private String? _HouseNum; + /// 房屋号 + [DisplayName("房屋号")] + [Description("房屋号")] + [DataObjectField(false, false, true, 20)] + [BindColumn("HouseNum", "房屋号", "varchar(20)")] + public String? HouseNum { get => _HouseNum; set { if (OnPropertyChanging("HouseNum", value)) { _HouseNum = value; OnPropertyChanged("HouseNum"); } } } + + private String? _CreateUser; + /// 创建者 + [DisplayName("创建者")] + [Description("创建者")] + [DataObjectField(false, false, true, 100)] + [BindColumn("CreateUser", "创建者", "varchar(100)")] + public String? CreateUser { get => _CreateUser; set { if (OnPropertyChanging("CreateUser", value)) { _CreateUser = value; OnPropertyChanged("CreateUser"); } } } + + private Int32 _CreateUserId; + /// 创建者ID + [DisplayName("创建者ID")] + [Description("创建者ID")] + [DataObjectField(false, false, false, 0)] + [BindColumn("CreateUserId", "创建者ID", "int(11)")] + public Int32 CreateUserId { get => _CreateUserId; set { if (OnPropertyChanging("CreateUserId", value)) { _CreateUserId = value; OnPropertyChanged("CreateUserId"); } } } + + private DateTime _CreateTime; + /// 创建时间 + [DisplayName("创建时间")] + [Description("创建时间")] + [DataObjectField(false, false, true, 0)] + [BindColumn("CreateTime", "创建时间", "")] + public DateTime CreateTime { get => _CreateTime; set { if (OnPropertyChanging("CreateTime", value)) { _CreateTime = value; OnPropertyChanged("CreateTime"); } } } + + private String? _CreateIP; + /// 创建IP + [DisplayName("创建IP")] + [Description("创建IP")] + [DataObjectField(false, false, true, 50)] + [BindColumn("CreateIP", "创建IP", "varchar(50)")] + public String? CreateIP { get => _CreateIP; set { if (OnPropertyChanging("CreateIP", value)) { _CreateIP = value; OnPropertyChanged("CreateIP"); } } } + + private String? _UpdateUser; + /// 修改用户 + [DisplayName("修改用户")] + [Description("修改用户")] + [DataObjectField(false, false, true, 100)] + [BindColumn("UpdateUser", "修改用户", "varchar(100)")] + public String? UpdateUser { get => _UpdateUser; set { if (OnPropertyChanging("UpdateUser", value)) { _UpdateUser = value; OnPropertyChanged("UpdateUser"); } } } + + private Int32 _UpdateUserId; + /// 修改用户ID + [DisplayName("修改用户ID")] + [Description("修改用户ID")] + [DataObjectField(false, false, false, 0)] + [BindColumn("UpdateUserId", "修改用户ID", "int(11)")] + public Int32 UpdateUserId { get => _UpdateUserId; set { if (OnPropertyChanging("UpdateUserId", value)) { _UpdateUserId = value; OnPropertyChanged("UpdateUserId"); } } } + + private DateTime _UpdateTime; + /// 修改时间 + [DisplayName("修改时间")] + [Description("修改时间")] + [DataObjectField(false, false, true, 0)] + [BindColumn("UpdateTime", "修改时间", "")] + public DateTime UpdateTime { get => _UpdateTime; set { if (OnPropertyChanging("UpdateTime", value)) { _UpdateTime = value; OnPropertyChanged("UpdateTime"); } } } + + private String? _UpdateIP; + /// 修改IP + [DisplayName("修改IP")] + [Description("修改IP")] + [DataObjectField(false, false, true, 50)] + [BindColumn("UpdateIP", "修改IP", "varchar(50)")] + public String? UpdateIP { get => _UpdateIP; set { if (OnPropertyChanging("UpdateIP", value)) { _UpdateIP = value; OnPropertyChanged("UpdateIP"); } } } + + private String? _Remark; + /// 备注 + [DisplayName("备注")] + [Description("备注")] + [DataObjectField(false, false, true, 200)] + [BindColumn("Remark", "备注", "varchar(200)")] + public String? Remark { get => _Remark; set { if (OnPropertyChanging("Remark", value)) { _Remark = value; OnPropertyChanged("Remark"); } } } + #endregion + + #region 获取/设置 字段值 + /// 获取/设置 字段值 + /// 字段名 + /// + public override Object? this[String name] + { + get => name switch + { + "PersonID" => _PersonID, + "Pname" => _Pname, + "Psex" => _Psex, + "CreditNo" => _CreditNo, + "Mobile" => _Mobile, + "BuildID" => _BuildID, + "Build_ID" => _Build_ID, + "UnitNum" => _UnitNum, + "HouseNum" => _HouseNum, + "CreateUser" => _CreateUser, + "CreateUserId" => _CreateUserId, + "CreateTime" => _CreateTime, + "CreateIP" => _CreateIP, + "UpdateUser" => _UpdateUser, + "UpdateUserId" => _UpdateUserId, + "UpdateTime" => _UpdateTime, + "UpdateIP" => _UpdateIP, + "Remark" => _Remark, + _ => base[name] + }; + set + { + switch (name) + { + case "PersonID": _PersonID = value.ToInt(); break; + case "Pname": _Pname = Convert.ToString(value); break; + case "Psex": _Psex = value.ToInt(); break; + case "CreditNo": _CreditNo = Convert.ToString(value); break; + case "Mobile": _Mobile = Convert.ToString(value); break; + case "BuildID": _BuildID = value.ToInt(); break; + case "Build_ID": _Build_ID = value.ToInt(); break; + case "UnitNum": _UnitNum = Convert.ToString(value); break; + case "HouseNum": _HouseNum = Convert.ToString(value); break; + case "CreateUser": _CreateUser = Convert.ToString(value); break; + case "CreateUserId": _CreateUserId = value.ToInt(); break; + case "CreateTime": _CreateTime = value.ToDateTime(); break; + case "CreateIP": _CreateIP = Convert.ToString(value); break; + case "UpdateUser": _UpdateUser = Convert.ToString(value); break; + case "UpdateUserId": _UpdateUserId = value.ToInt(); break; + case "UpdateTime": _UpdateTime = value.ToDateTime(); break; + case "UpdateIP": _UpdateIP = Convert.ToString(value); break; + case "Remark": _Remark = Convert.ToString(value); break; + default: base[name] = value; break; + } + } + } + #endregion + + #region 关联映射 + #endregion + + #region 字段名 + /// 取得居民信息字段信息的快捷方式 + public partial class _ + { + /// 编号 + public static readonly Field PersonID = FindByName("PersonID"); + + /// 姓名 + public static readonly Field Pname = FindByName("Pname"); + + /// 性别 + public static readonly Field Psex = FindByName("Psex"); + + /// 身份证号 + public static readonly Field CreditNo = FindByName("CreditNo"); + + /// 联系电话 + public static readonly Field Mobile = FindByName("Mobile"); + + /// 楼宇ID + public static readonly Field BuildID = FindByName("BuildID"); + + /// 平台楼号 + public static readonly Field Build_ID = FindByName("Build_ID"); + + /// 单元号 + public static readonly Field UnitNum = FindByName("UnitNum"); + + /// 房屋号 + public static readonly Field HouseNum = FindByName("HouseNum"); + + /// 创建者 + public static readonly Field CreateUser = FindByName("CreateUser"); + + /// 创建者ID + public static readonly Field CreateUserId = FindByName("CreateUserId"); + + /// 创建时间 + public static readonly Field CreateTime = FindByName("CreateTime"); + + /// 创建IP + public static readonly Field CreateIP = FindByName("CreateIP"); + + /// 修改用户 + public static readonly Field UpdateUser = FindByName("UpdateUser"); + + /// 修改用户ID + public static readonly Field UpdateUserId = FindByName("UpdateUserId"); + + /// 修改时间 + public static readonly Field UpdateTime = FindByName("UpdateTime"); + + /// 修改IP + public static readonly Field UpdateIP = FindByName("UpdateIP"); + + /// 备注 + public static readonly Field Remark = FindByName("Remark"); + + static Field FindByName(String name) => Meta.Table.FindByName(name); + } + + /// 取得居民信息字段名称的快捷方式 + public partial class __ + { + /// 编号 + public const String PersonID = "PersonID"; + + /// 姓名 + public const String Pname = "Pname"; + + /// 性别 + public const String Psex = "Psex"; + + /// 身份证号 + public const String CreditNo = "CreditNo"; + + /// 联系电话 + public const String Mobile = "Mobile"; + + /// 楼宇ID + public const String BuildID = "BuildID"; + + /// 平台楼号 + public const String Build_ID = "Build_ID"; + + /// 单元号 + public const String UnitNum = "UnitNum"; + + /// 房屋号 + public const String HouseNum = "HouseNum"; + + /// 创建者 + public const String CreateUser = "CreateUser"; + + /// 创建者ID + public const String CreateUserId = "CreateUserId"; + + /// 创建时间 + public const String CreateTime = "CreateTime"; + + /// 创建IP + public const String CreateIP = "CreateIP"; + + /// 修改用户 + public const String UpdateUser = "UpdateUser"; + + /// 修改用户ID + public const String UpdateUserId = "UpdateUserId"; + + /// 修改时间 + public const String UpdateTime = "UpdateTime"; + + /// 修改IP + public const String UpdateIP = "UpdateIP"; + + /// 备注 + public const String Remark = "Remark"; + } + #endregion +} diff --git a/XUnitTest.XCode/Model/Code/entity_city_biz.cs b/XUnitTest.XCode/Model/Code/entity_city_biz.cs new file mode 100644 index 000000000..213c0ec0b --- /dev/null +++ b/XUnitTest.XCode/Model/Code/entity_city_biz.cs @@ -0,0 +1,223 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; +using System.Web; +using System.Web.Script.Serialization; +using System.Xml.Serialization; +using NewLife; +using NewLife.Data; +using NewLife.Log; +using NewLife.Model; +using NewLife.Reflection; +using NewLife.Threading; +using NewLife.Web; +using XCode; +using XCode.Cache; +using XCode.Configuration; +using XCode.DataAccessLayer; +using XCode.Membership; +using XCode.Shards; + +namespace Company.MyName; + +public partial class CorePerson : Entity +{ + #region 对象操作 + static CorePerson() + { + // 累加字段,生成 Update xx Set Count=Count+1234 Where xxx + //var df = Meta.Factory.AdditionalFields; + //df.Add(nameof(Psex)); + + // 过滤器 UserModule、TimeModule、IPModule + Meta.Modules.Add(new UserModule { AllowEmpty = false }); + Meta.Modules.Add(); + Meta.Modules.Add(new IPModule { AllowEmpty = false }); + + // 实体缓存 + // var ec = Meta.Cache; + // ec.Expire = 60; + } + + /// 验证并修补数据,返回验证结果,或者通过抛出异常的方式提示验证失败。 + /// 添删改方法 + public override Boolean Valid(DataMethod method) + { + //if (method == DataMethod.Delete) return true; + // 如果没有脏数据,则不需要进行任何处理 + if (!HasDirty) return true; + + // 建议先调用基类方法,基类方法会做一些统一处理 + if (!base.Valid(method)) return false; + + // 在新插入数据或者修改了指定字段时进行修正 + + // 处理当前已登录用户信息,可以由UserModule过滤器代劳 + /*var user = ManageProvider.User; + if (user != null) + { + if (method == DataMethod.Insert && !Dirtys[nameof(CreateUserId)]) CreateUserId = user.ID; + if (!Dirtys[nameof(UpdateUserId)]) UpdateUserId = user.ID; + }*/ + //if (method == DataMethod.Insert && !Dirtys[nameof(CreateTime)]) CreateTime = DateTime.Now; + //if (!Dirtys[nameof(UpdateTime)]) UpdateTime = DateTime.Now; + //if (method == DataMethod.Insert && !Dirtys[nameof(CreateIP)]) CreateIP = ManageProvider.UserHost; + //if (!Dirtys[nameof(UpdateIP)]) UpdateIP = ManageProvider.UserHost; + + // 检查唯一索引 + // CheckExist(method == DataMethod.Insert, nameof(Pname), nameof(CreditNo)); + + return true; + } + + ///// 首次连接数据库时初始化数据,仅用于实体类重载,用户不应该调用该方法 + //[EditorBrowsable(EditorBrowsableState.Never)] + //protected override void InitData() + //{ + // // InitData一般用于当数据表没有数据时添加一些默认数据,该实体类的任何第一次数据库操作都会触发该方法,默认异步调用 + // if (Meta.Session.Count > 0) return; + + // if (XTrace.Debug) XTrace.WriteLine("开始初始化CorePerson[居民信息]数据……"); + + // var entity = new CorePerson(); + // entity.Pname = "abc"; + // entity.Psex = 0; + // entity.CreditNo = "abc"; + // entity.Mobile = "abc"; + // entity.BuildID = 0; + // entity.Build_ID = 0; + // entity.UnitNum = "abc"; + // entity.HouseNum = "abc"; + // entity.CreateUser = "abc"; + // entity.CreateUserId = 0; + // entity.CreateTime = DateTime.Now; + // entity.CreateIP = "abc"; + // entity.UpdateUser = "abc"; + // entity.UpdateUserId = 0; + // entity.UpdateTime = DateTime.Now; + // entity.UpdateIP = "abc"; + // entity.Remark = "abc"; + // entity.Insert(); + + // if (XTrace.Debug) XTrace.WriteLine("完成初始化CorePerson[居民信息]数据!"); + //} + + ///// 已重载。基类先调用Valid(true)验证数据,然后在事务保护内调用OnInsert + ///// + //public override Int32 Insert() + //{ + // return base.Insert(); + //} + + ///// 已重载。在事务保护范围内处理业务,位于Valid之后 + ///// + //protected override Int32 OnDelete() + //{ + // return base.OnDelete(); + //} + #endregion + + #region 扩展属性 + #endregion + + #region 扩展查询 + /// 根据编号查找 + /// 编号 + /// 实体对象 + public static CorePerson FindByPersonID(Int32 personId) + { + if (personId <= 0) return null; + + // 实体缓存 + if (Meta.Session.Count < 1000) return Meta.Cache.Find(e => e.PersonID == personId); + + // 单对象缓存 + return Meta.SingleCache[personId]; + + //return Find(_.PersonID == personId); + } + + /// 根据姓名、身份证号查找 + /// 姓名 + /// 身份证号 + /// 实体对象 + public static CorePerson FindByPnameAndCreditNo(String pname, String creditNo) + { + // 实体缓存 + if (Meta.Session.Count < 1000) return Meta.Cache.Find(e => e.Pname.EqualIgnoreCase(pname) && e.CreditNo.EqualIgnoreCase(creditNo)); + + return Find(_.Pname == pname & _.CreditNo == creditNo); + } + + /// 根据平台楼号查找 + /// 平台楼号 + /// 实体列表 + public static IList FindAllByBuild_ID(Int32 build_ID) + { + if (build_ID <= 0) return new List(); + + // 实体缓存 + if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.Build_ID == build_ID); + + return FindAll(_.Build_ID == build_ID); + } + + /// 根据楼宇ID查找 + /// 楼宇ID + /// 实体列表 + public static IList FindAllByBuildID(Int32 buildId) + { + if (buildId <= 0) return new List(); + + // 实体缓存 + if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.BuildID == buildId); + + return FindAll(_.BuildID == buildId); + } + #endregion + + #region 高级查询 + /// 高级查询 + /// 姓名 + /// 身份证号 + /// 楼宇ID + /// 平台楼号 + /// 修改时间开始 + /// 修改时间结束 + /// 关键字 + /// 分页参数信息。可携带统计和数据权限扩展查询等信息 + /// 实体列表 + public static IList Search(String pname, String creditNo, Int32 buildId, Int32 build_ID, DateTime start, DateTime end, String key, PageParameter page) + { + var exp = new WhereExpression(); + + if (!pname.IsNullOrEmpty()) exp &= _.Pname == pname; + if (!creditNo.IsNullOrEmpty()) exp &= _.CreditNo == creditNo; + if (buildId >= 0) exp &= _.BuildID == buildId; + if (build_ID >= 0) exp &= _.Build_ID == build_ID; + exp &= _.UpdateTime.Between(start, end); + if (!key.IsNullOrEmpty()) exp &= _.Pname.Contains(key) | _.CreditNo.Contains(key) | _.Mobile.Contains(key) | _.UnitNum.Contains(key) | _.HouseNum.Contains(key) | _.CreateUser.Contains(key) | _.CreateIP.Contains(key) | _.UpdateUser.Contains(key) | _.UpdateIP.Contains(key) | _.Remark.Contains(key); + + return FindAll(exp, page); + } + + // Select Count(PersonID) as PersonID,Pname From core_person Where CreateTime>'2020-01-24 00:00:00' Group By Pname Order By PersonID Desc limit 20 + static readonly FieldCache _PnameCache = new FieldCache(nameof(Pname)) + { + //Where = _.CreateTime > DateTime.Today.AddDays(-30) & Expression.Empty + }; + + /// 获取姓名列表,字段缓存10分钟,分组统计数据最多的前20种,用于魔方前台下拉选择 + /// + public static IDictionary GetPnameList() => _PnameCache.FindAllName(); + #endregion + + #region 业务操作 + #endregion +} diff --git a/XUnitTest.XCode/Model/ModelHelperTests.cs b/XUnitTest.XCode/Model/ModelHelperTests.cs index 08c15ab20..59be15f04 100644 --- a/XUnitTest.XCode/Model/ModelHelperTests.cs +++ b/XUnitTest.XCode/Model/ModelHelperTests.cs @@ -1,6 +1,7 @@ using System; using System.IO; using NewLife.Collections; +using NewLife.Data; using XCode.Code; using XCode.DataAccessLayer; using Xunit; @@ -115,6 +116,16 @@ public void Import2023() Assert.Equal("部门。组织机构,多级树状结构", dep.Description); } + private String ReadTarget(String file, String text) + { + //var file2 = @"..\..\XUnitTest.XCode\".CombinePath(file); + //File.WriteAllText(file2.EnsureDirectory(true), text); + + var target = File.ReadAllText(file.GetFullPath()); + + return target; + } + [Fact] public void ImportCity() { @@ -125,6 +136,14 @@ public void ImportCity() Assert.NotEmpty(tables); Assert.Equal(1, tables.Count); + var column = tables[0].Columns[6]; + Assert.NotNull(column.Name); + Assert.NotEmpty(column.Name); + Assert.NotNull(column.ColumnName); + Assert.NotEmpty(column.ColumnName); + + //column.Fix(); + var option = new EntityBuilderOption(); var atts = new NullableDictionary(StringComparer.OrdinalIgnoreCase); var xml = File.ReadAllText(file.GetFullPath()); @@ -135,6 +154,42 @@ public void ImportCity() Assert.Equal(1, tables.Count); var xml2 = DAL.Export(tables); - Assert.Equal(xml, xml2); + //Assert.Equal(xml, xml2); + + // 代码生成 + + option = new EntityBuilderOption + { + ConnName = "MyConn", + Namespace = "Company.MyName", + //Partial = true, + Nullable = true, + }; + + var builder = new EntityBuilder + { + Table = tables[0], + Option = option, + }; + + // 数据类 + builder.Execute(); + + var rs = builder.ToString(); + Assert.NotEmpty(rs); + + var target = ReadTarget("Model\\Code\\entity_city.cs", rs); + Assert.Equal(target, rs); + + // 业务类 + builder.Clear(); + builder.Business = true; + builder.Execute(); + + rs = builder.ToString(); + Assert.NotEmpty(rs); + + target = ReadTarget("Model\\Code\\entity_city_biz.cs", rs); + Assert.Equal(target, rs); } } diff --git a/XUnitTest.XCode/XUnitTest.XCode.csproj b/XUnitTest.XCode/XUnitTest.XCode.csproj index 6b9fd6f49..8dded7664 100644 --- a/XUnitTest.XCode/XUnitTest.XCode.csproj +++ b/XUnitTest.XCode/XUnitTest.XCode.csproj @@ -143,6 +143,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest +