예제 #1
0
파일: Map.cs 프로젝트: top501/DVTK-1
        // -------------------------------
        // - 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);
                    }
                }
            }
        }
예제 #2
0
 /// <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));
 }
예제 #3
0
        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);
        }
예제 #4
0
        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;
        }
예제 #7
0
        /// <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);
        }
예제 #8
0
        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);
        }