// ------------------------------- // - Begin public methods region - // ------------------------------- /// <summary> /// Convert a HLI Attribute Set to a AttributeLayer Attribute Set. /// </summary> /// <param name="attributeSetIn">The HLI Attribute Set.</param> /// <param name="attributeSetOut">The AttributeLayer Attribute Set.</param> public static void ToAttributeSet(DvtkHighLevelInterface.Dicom.Other.AttributeSet attributeSetIn, Dvtk.Dicom.AttributeLayer.AttributeSet attributeSetOut) { for (int index = 0; index < attributeSetIn.Count; index++) { DvtkHighLevelInterface.Dicom.Other.Attribute hliAttribute = attributeSetIn[index]; Tag tag = new Tag(hliAttribute.GroupNumber, hliAttribute.ElementNumber); if (hliAttribute.VR != DvtkData.Dimse.VR.SQ) { SingleAttribute singleAttribute = new SingleAttribute(tag, (VR)Enum.Parse(typeof(VR), hliAttribute.VR.ToString(), true), attributeSetOut); } else { SequenceAttribute sequenceAttribute = new SequenceAttribute(tag, attributeSetOut); for (int sequenceItemIndex = 1; sequenceItemIndex <= hliAttribute.ItemCount; sequenceItemIndex++) { DvtkHighLevelInterface.Dicom.Other.SequenceItem hliSequenceItem = hliAttribute.GetItem(sequenceItemIndex); SequenceItem sequenceItem = new SequenceItem(sequenceAttribute); ToAttributeSet(hliSequenceItem, sequenceItem); } } } }
/// <summary> /// シーケンス属性からインスタンスを生成します。 /// </summary> /// <param name="attribute">シーケンス属性</param> /// <returns>生成されたインスタンス</returns> internal static This From(SequenceAttribute attribute) { if (attribute == null) { throw new ArgumentNullException(nameof(attribute)); } return(new This(attribute.Schema, attribute.Name)); }
private static string GetSequenceName <TEntity, TId>() where TEntity : IEntity <TId> { Type entityType = typeof(TEntity); SequenceAttribute attribute = entityType.GetCustomAttribute <SequenceAttribute>(); if (attribute == null) { throw new InvalidOperationException("You need to decorate your entity with Sequence attribute to use this extension method."); } string sequenceName = attribute.Name; return(sequenceName); }
public virtual TId GetNextId <TEntity, TId>() where TEntity : IEntity <TId> { Type entityType = typeof(TEntity); SequenceAttribute attribute = entityType.GetCustomAttribute <SequenceAttribute>(); if (attribute == null) { throw new InvalidOperationException("You need to decorate your entity with Sequence attribute to use this extension method."); } string sequenceName = attribute.Name; DbRawSqlQuery <TId> result = Database.SqlQuery <TId>($"SELECT (NEXT VALUE FOR {sequenceName})"); TId id = result.FirstOrDefault(); if (id == null || id.Equals(default(TId))) { throw new InvalidOperationException($"Database did not return an instance of identity for sequence {sequenceName}."); } return(id); }
/// <summary> /// The create sequence attribute. /// </summary> /// <param name="attribute"> /// The attribute type. /// </param> /// <param name="attributeValue"> /// The attribute value. /// </param> /// <param name="sequenceId"> /// The sequence id. /// </param> /// <returns> /// The <see cref="SequenceAttribute"/>. /// </returns> private SequenceAttribute CreateSequenceAttribute(LibiadaWeb.Attribute attribute, string attributeValue, long sequenceId) { var subsequenceAttribute = new SequenceAttribute { Attribute = attribute, SequenceId = sequenceId, Value = attributeValue }; return subsequenceAttribute; }
/// <summary> /// The create sequence attribute. /// </summary> /// <param name="attributeName"> /// The attribute name. /// </param> /// <param name="attributeValue"> /// The attribute value. /// </param> /// <param name="sequenceId"> /// The sequence id. /// </param> /// <returns> /// The <see cref="SequenceAttribute"/>. /// </returns> private SequenceAttribute CreateSequenceAttribute(string attributeName, string attributeValue, long sequenceId) { var attribute = attributeRepository.GetAttributeByName(attributeName); var subsequenceAttribute = new SequenceAttribute { Attribute = attribute, SequenceId = sequenceId, Value = attributeValue }; return subsequenceAttribute; }
/// <summary> /// VisitEnter method in the context of the "Hierarchical Visitor Pattern". /// See "DVTk_Library\Documentation\Design\Hierarchical Visitor Pattern.htm". /// </summary> /// <param name="sequenceAttribute">The SequenceAttribute instance to visit.</param> /// <returns> /// true: traverse the children of this instance. /// false: do not traverse the children of this instance. /// </returns> public override bool VisitEnterSequenceAttribute(SequenceAttribute sequenceAttribute) { VisitAttribute(sequenceAttribute); return(true); }
private void GenEntityEx(CodeNamespace ns, Type type, int outLang) { CodeTypeDeclaration entity; StringBuilder sb = new StringBuilder(); entity = new CodeTypeDeclaration(type.Name); ns.Types.Add(entity); entity.CustomAttributes.Add(new CodeAttributeDeclaration(typeof(System.SerializableAttribute).Name)); entity.IsClass = true; entity.IsPartial = true; Type[] interfaces = GetContractInterfaceTypes(type); bool findNonEntityBaseEntity = false; string entityBaseTypeName = null; foreach (Type item in interfaces) { if (typeof(IEntity).IsAssignableFrom(item) && (typeof(IEntity) != item)) { entityBaseTypeName = item.Name; entity.BaseTypes.Add(entityBaseTypeName); findNonEntityBaseEntity = true; break; } } if (!findNonEntityBaseEntity) { entity.BaseTypes.Add(typeof(Entity)); } string tableName = GetTableName(type); DescriptionAttribute ca = GetEntityAttribute <DescriptionAttribute>(type); #region 获取主键列 StringBuilder sbKey = new StringBuilder(); List <string> listKey = new List <string>(); GenGetPrimaryKeyFieldListEx(sbKey, type, listKey, outLang); #endregion if (ca != null) { //sb.Append("\t/// <summary>\r\n"); //sb.Append("\t/// "); //sb.Append(ca.Description.Replace("\n", "\n\t/// ")); //sb.Append("\r\n\t/// </summary>\r\n"); entity.Comments.Add(new CodeCommentStatement("<summary>", true)); entity.Comments.Add(new CodeCommentStatement(ca.Description + string.Format(" - 表名:{0} 主键列:{1}", tableName, string.Join(",", listKey.ToArray())), true)); entity.Comments.Add(new CodeCommentStatement("</summary>", true)); } else { entity.Comments.Add(new CodeCommentStatement("<summary>", true)); entity.Comments.Add(new CodeCommentStatement(string.Format("表名:{0} 主键列:{1}", tableName, string.Join(",", listKey.ToArray())), true)); entity.Comments.Add(new CodeCommentStatement("</summary>", true)); } bool isReadonly = false; ReadOnlyAttribute read = GetEntityAttribute <ReadOnlyAttribute>(type); if (read != null) { isReadonly = true; } //generate properties CodeStatementCollection reloadQueryStatements = new CodeStatementCollection(); GenPropertiesEx(entity, reloadQueryStatements, type, isReadonly, outLang); List <string> generatedProperties = new List <string>(); CodeMemberMethod method; CodeExpression[] arrayInit; StringBuilder sbPropertyValuesList; string[] fieldsList; #region 实现重载的信息 #region 重载获取表名和只读 CodeTypeReference reference = new CodeTypeReference(typeof(Table).FullName, new CodeTypeReference(type.Name, CodeTypeReferenceOptions.GenericTypeParameter)); CodeExpression codeExpression = new CodeObjectCreateExpression(reference, new CodeExpression[] { new CodePrimitiveExpression(tableName) }); //生成重载的方法 method = new CodeMemberMethod(); method.Name = "GetTable"; method.Attributes = MemberAttributes.Family | MemberAttributes.Override; method.ReturnType = new CodeTypeReference(typeof(Table)); //添加注释 method.Comments.Add(new CodeCommentStatement("<summary>", true)); method.Comments.Add(new CodeCommentStatement("获取实体对应的表名", true)); method.Comments.Add(new CodeCommentStatement("</summary>", true)); //CodeAssignStatement ass = new CodeAssignStatement(); //ass.Left = new CodeSnippetExpression("mappingTable"); //ass.Right = new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(new CodeSnippetExpression("EntityConfig"), "GetTable"), new CodePrimitiveExpression(tableName)); //CodeConditionStatement condition = new CodeConditionStatement(); //condition.Condition = new CodeBinaryOperatorExpression(new CodePrimitiveExpression(null), CodeBinaryOperatorType.IdentityEquality, new CodeSnippetExpression("mappingTable")); //condition.TrueStatements.Add(ass); //method.Statements.Add(condition); //method.Statements.Add(new CodeMethodReturnStatement(new CodeSnippetExpression("mappingTable"))); //entity.Members.Add(method); //new CodeTypeReference(type.Name, method.Statements.Add(new CodeMethodReturnStatement(codeExpression)); entity.Members.Add(method); if (isReadonly) { method = new CodeMemberMethod(); method.Name = "GetReadOnly"; method.Attributes = MemberAttributes.Family | MemberAttributes.Override; method.ReturnType = new CodeTypeReference(typeof(bool)); //添加注释 method.Comments.Add(new CodeCommentStatement("<summary>", true)); method.Comments.Add(new CodeCommentStatement("获取实体是否只读", true)); method.Comments.Add(new CodeCommentStatement("</summary>", true)); method.Statements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(true))); entity.Members.Add(method); } SequenceAttribute auto = GetEntityAttribute <SequenceAttribute>(type); if (auto != null) { method = new CodeMemberMethod(); method.Name = "GetSequence"; method.Attributes = MemberAttributes.Family | MemberAttributes.Override; method.ReturnType = new CodeTypeReference(typeof(string)); //添加注释 method.Comments.Add(new CodeCommentStatement("<summary>", true)); method.Comments.Add(new CodeCommentStatement("获取自增长列的名称", true)); method.Comments.Add(new CodeCommentStatement("</summary>", true)); method.Statements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(auto.Name))); entity.Members.Add(method); } #endregion sbPropertyValuesList = new StringBuilder(); generatedProperties.Clear(); //sb.Append("\t\tpublic override object[] GetPropertyValues()\r\n\t\t{\r\n"); //sb.Append("\t\t\treturn new object[] { "); GenGetIdentityFieldEx(sbPropertyValuesList, type, generatedProperties, outLang); //sb.Append(sbPropertyValuesList.ToString().TrimEnd(' ', ',')); //sb.Append(" };\r\n\t\t}\r\n\r\n"); fieldsList = sbPropertyValuesList.ToString().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (generatedProperties.Count > 0) { method = new CodeMemberMethod(); method.Name = "GetIdentityField"; method.Attributes = MemberAttributes.Family | MemberAttributes.Override; method.ReturnType = new CodeTypeReference(typeof(Field)); //添加注释 method.Comments.Add(new CodeCommentStatement("<summary>", true)); method.Comments.Add(new CodeCommentStatement("获取实体中的标识列", true)); method.Comments.Add(new CodeCommentStatement("</summary>", true)); method.Statements.Add(new CodeMethodReturnStatement(new CodeSnippetExpression(fieldsList[0].Trim()))); entity.Members.Add(method); } sbPropertyValuesList = new StringBuilder(); generatedProperties.Clear(); //sb.Append("\t\tpublic override object[] GetPropertyValues()\r\n\t\t{\r\n"); //sb.Append("\t\t\treturn new object[] { "); GenGetPrimaryKeyFieldListEx(sbPropertyValuesList, type, generatedProperties, outLang); //sb.Append(sbPropertyValuesList.ToString().TrimEnd(' ', ',')); //sb.Append(" };\r\n\t\t}\r\n\r\n"); fieldsList = sbPropertyValuesList.ToString().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); arrayInit = new CodeExpression[fieldsList.Length]; for (int i = 0; i < fieldsList.Length; i++) { arrayInit[i] = new CodeSnippetExpression(fieldsList[i].Trim()); } if (arrayInit.Length > 0) { method = new CodeMemberMethod(); method.Name = "GetPrimaryKeyFields"; method.Attributes = MemberAttributes.Family | MemberAttributes.Override; method.ReturnType = new CodeTypeReference(new CodeTypeReference(typeof(Field)), 1); //添加注释 method.Comments.Add(new CodeCommentStatement("<summary>", true)); method.Comments.Add(new CodeCommentStatement("获取实体中的主键列", true)); method.Comments.Add(new CodeCommentStatement("</summary>", true)); method.Statements.Add(new CodeMethodReturnStatement(new CodeArrayCreateExpression(typeof(Field), arrayInit))); entity.Members.Add(method); } method = new CodeMemberMethod(); method.Name = "GetFields"; method.Attributes = MemberAttributes.Family | MemberAttributes.Override; method.ReturnType = new CodeTypeReference(new CodeTypeReference(typeof(Field)), 1); sbPropertyValuesList = new StringBuilder(); generatedProperties.Clear(); //sb.Append("\t\tpublic override object[] GetPropertyValues()\r\n\t\t{\r\n"); //sb.Append("\t\t\treturn new object[] { "); GenGetFieldListEx(sbPropertyValuesList, type, generatedProperties, outLang); //sb.Append(sbPropertyValuesList.ToString().TrimEnd(' ', ',')); //sb.Append(" };\r\n\t\t}\r\n\r\n"); fieldsList = sbPropertyValuesList.ToString().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); arrayInit = new CodeExpression[generatedProperties.Count]; for (int i = 0; i < generatedProperties.Count; i++) { arrayInit[i] = new CodeSnippetExpression(fieldsList[i].Trim()); } if (arrayInit.Length > 0) { //添加注释 method.Comments.Add(new CodeCommentStatement("<summary>", true)); method.Comments.Add(new CodeCommentStatement(string.Format("获取列信息"), true)); method.Comments.Add(new CodeCommentStatement("</summary>", true)); method.Statements.Add(new CodeMethodReturnStatement(new CodeArrayCreateExpression(typeof(Field), arrayInit))); entity.Members.Add(method); } #endregion method = new CodeMemberMethod(); method.Name = "GetValues"; method.Attributes = MemberAttributes.Family | MemberAttributes.Override; method.ReturnType = new CodeTypeReference(new CodeTypeReference(typeof(object)), 1); sbPropertyValuesList = new StringBuilder(); generatedProperties.Clear(); //sb.Append("\t\tpublic override object[] GetPropertyValues()\r\n\t\t{\r\n"); //sb.Append("\t\t\treturn new object[] { "); GenGetPropertyValues(sbPropertyValuesList, type, generatedProperties); //sb.Append(sbPropertyValuesList.ToString().TrimEnd(' ', ',')); //sb.Append(" };\r\n\t\t}\r\n\r\n"); fieldsList = sbPropertyValuesList.ToString().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); arrayInit = new CodeExpression[generatedProperties.Count]; for (int i = 0; i < generatedProperties.Count; i++) { arrayInit[i] = new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), fieldsList[i].Trim()); } if (arrayInit.Length > 0) { //添加注释 method.Comments.Add(new CodeCommentStatement("<summary>", true)); method.Comments.Add(new CodeCommentStatement(string.Format("获取列数据"), true)); method.Comments.Add(new CodeCommentStatement("</summary>", true)); method.Statements.Add(new CodeMethodReturnStatement(new CodeArrayCreateExpression(typeof(object), arrayInit))); entity.Members.Add(method); } else { method.Statements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(null))); entity.Members.Add(method); } method = new CodeMemberMethod(); method.Attributes = MemberAttributes.Family | MemberAttributes.Override; method.Name = "SetValues"; method.ReturnType = null; //添加注释 method.Comments.Add(new CodeCommentStatement("<summary>", true)); method.Comments.Add(new CodeCommentStatement("给当前实体赋值", true)); method.Comments.Add(new CodeCommentStatement("</summary>", true)); method.Parameters.Add(new CodeParameterDeclarationExpression(typeof(IRowReader), "reader")); //sb.Append("\t\tpublic override void SetPropertyValues(System.Data.IDataReader reader)\r\n\t\t{\r\n"); generatedProperties.Clear(); GenSetPropertyValuesFromReaderEx(method.Statements, type, generatedProperties, outLang); entity.Members.Add(method); //outNs + "." + string entityOutputTypeName = type.Name; //, CodeTypeReferenceOptions.GlobalReference CodeTypeReference entityOutputTypeNameRef = new CodeTypeReference(entityOutputTypeName); //sb.Append("\t\tpublic override int GetHashCode() { return base.GetHashCode(); }\r\n\r\n"); method = new CodeMemberMethod(); method.Attributes = MemberAttributes.Public | MemberAttributes.Override; method.Name = "GetHashCode"; method.ReturnType = new CodeTypeReference(typeof(int)); method.Statements.Add(new CodeMethodReturnStatement(new CodeMethodInvokeExpression(new CodeBaseReferenceExpression(), "GetHashCode", new CodeExpression[] { }))); entity.Members.Add(method); //sb.Append("\t\tpublic override bool Equals(object obj)\r\n\t\t{\r\n\t\t\treturn obj == null || (!(obj is " + entityOutputTypeName + ")) ? false : ((object)this) == ((object)obj) ? true : this.isAttached && ((" + entityOutputTypeName + ")obj).isAttached"); method = new CodeMemberMethod(); method.Name = "Equals"; method.Attributes = MemberAttributes.Public | MemberAttributes.Override; method.ReturnType = new CodeTypeReference(typeof(bool)); method.Parameters.Add(new CodeParameterDeclarationExpression(typeof(object), "obj")); //if (obj == null) return false; //if ((obj is global::Entities.LocalUser) == false) return false; //if (((object)this) == ((object)obj)) return true; //return this.isAttached && ((global::Entities.LocalUser)obj).isAttached && this.ID == ((global::Entities.LocalUser)obj).ID; method.Statements.Add(new CodeConditionStatement(new CodeBinaryOperatorExpression(new CodeArgumentReferenceExpression("obj"), CodeBinaryOperatorType.IdentityEquality, new CodePrimitiveExpression(null)), new CodeStatement[] { new CodeMethodReturnStatement(new CodePrimitiveExpression(false)) })); method.Statements.Add(new CodeConditionStatement(new CodeBinaryOperatorExpression(new CodePrimitiveExpression(false), CodeBinaryOperatorType.ValueEquality, new CodeMethodInvokeExpression(new CodeTypeOfExpression(entityOutputTypeNameRef), "IsAssignableFrom", new CodeExpression[] { new CodeMethodInvokeExpression(new CodeArgumentReferenceExpression("obj"), "GetType", new CodeExpression[] { }) })), new CodeStatement[] { new CodeMethodReturnStatement(new CodePrimitiveExpression(false)) })); method.Statements.Add(new CodeConditionStatement(new CodeBinaryOperatorExpression(new CodeCastExpression(typeof(object), new CodeThisReferenceExpression()), CodeBinaryOperatorType.IdentityEquality, new CodeCastExpression(typeof(object), new CodeArgumentReferenceExpression("obj"))), new CodeStatement[] { new CodeMethodReturnStatement(new CodePrimitiveExpression(true)) })); method.Statements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(false))); //sb.Append(";\r\n\t\t}\r\n"); entity.Members.Add(method); //sb.Append("\r\n\t\t#endregion\r\n\r\n"); CodeTypeDeclaration queryClass = new CodeTypeDeclaration(); queryClass.IsClass = true; queryClass.Name = outLang == 0 ? "_" : "__"; queryClass.Attributes = MemberAttributes.Public | MemberAttributes.Static; if (findNonEntityBaseEntity) { queryClass.Attributes |= MemberAttributes.New; } entity.Members.Add(queryClass); generatedProperties.Clear(); #region 添加All字段 if (interfaces.Length == 0) { CodeMemberField field = new CodeMemberField(); field.Name = "All"; field.Attributes = MemberAttributes.Public | MemberAttributes.Static; field.Type = new CodeTypeReference(typeof(AllField)); //new CodeTypeReference(type.Name, reference = new CodeTypeReference(typeof(AllField).FullName, new CodeTypeReference(type.Name, CodeTypeReferenceOptions.GenericTypeParameter)); field.InitExpression = new CodeObjectCreateExpression(reference); //添加注释 field.Comments.Add(new CodeCommentStatement("<summary>", true)); field.Comments.Add(new CodeCommentStatement("表示选择所有列,与*等同", true)); field.Comments.Add(new CodeCommentStatement("</summary>", true)); queryClass.Members.Add(field); } #endregion GenPropertyQueryCodeEx(queryClass, type, generatedProperties, isReadonly); }