.net T4用于通过LLBLGen Pro实体生成POCO?

.net T4用于通过LLBLGen Pro实体生成POCO?,.net,orm,poco,t4,llblgenpro,.net,Orm,Poco,T4,Llblgenpro,据我所知,LLBLGen Pro无法在自己的实体上生成POCO(请参见此处:) 是否有人编写了T4,该T4将生成与LLBLGen Pro实体对应的POCO类,并生成与实体和POCO之间的适当转换逻辑?还有谁能想出一个不需要手动编写大量转换代码的解决方案吗?我们从LLBLGen而不是使用T4生成DTO 我们需要从一个实体创建DTO。从技术上讲,它们不是POCO,因为它们有一个ToEntity()和FromEntity()方法,但这可能适合您 我们创建了一个IDTO接口,然后由DTO类实现(每个实体

据我所知,LLBLGen Pro无法在自己的实体上生成POCO(请参见此处:)


是否有人编写了T4,该T4将生成与LLBLGen Pro实体对应的POCO类,并生成与实体和POCO之间的适当转换逻辑?还有谁能想出一个不需要手动编写大量转换代码的解决方案吗?

我们从LLBLGen而不是使用T4生成DTO

我们需要从一个实体创建DTO。从技术上讲,它们不是POCO,因为它们有一个
ToEntity()
FromEntity()
方法,但这可能适合您

我们创建了一个
IDTO
接口,然后由DTO类实现(每个实体一个)。我们没有修改实体模板,而是添加了将实体转换为DTO(以及许多其他辅助转换)的
DTOExtension
方法

以下是可以在LLBLGen v2.6中使用的模板文件。版本3中的模板设计器更易于使用,如果需要,可以将大部分代码转换为版本3

文件:EntitydPointerface.template

using System;
using System.ComponentModel;
using System.Collections;
using System.Runtime.Serialization;

using <[RootNamespace]>.HelperClasses;
using <[RootNamespace]>.EntityClasses;

using SD.LLBLGen.Pro.ORMSupportClasses;

namespace <[RootNamespace]>.DTOClasses
{
    /// <summary>
    /// DTO interface.
    /// </summary>
    public interface IDTO<T>
    {
        T ToEntity(T toFill);
        IDTO<T> FromEntity(T entityInstance, Hashtable seenObjects, Hashtable parents);
    }
}
using System;
using System.ComponentModel;
using System.Collections;
using System.Runtime.Serialization;

using <[RootNamespace]>.HelperClasses;
using <[RootNamespace]>.EntityClasses;

using SD.LLBLGen.Pro.ORMSupportClasses;

namespace <[RootNamespace]>.DTOClasses
{
    <[ UserCodeRegion "AdditionalNamespaces" ]>
    // __LLBLGENPRO_USER_CODE_REGION_START AdditionalNamespaces
    // __LLBLGENPRO_USER_CODE_REGION_END
    <[ EndUserCodeRegion ]> 
    /// <summary>
    /// DTO class for the entity '<[CurrentEntityName]>'.
    /// </summary>
    [Serializable]
    public <[If UsePartialClasses]>partial <[EndIf]>class <[CurrentEntityName]>DTO : <[ If IsSubType ]><[ SuperTypeName ]>DTO, <[ EndIf]>IDTO<<[CurrentEntityName]>Entity><[ UserCodeRegion "AdditionalInterfaces" ]>
        // __LLBLGENPRO_USER_CODE_REGION_START AdditionalInterfaces
        // __LLBLGENPRO_USER_CODE_REGION_END
        <[ EndUserCodeRegion ]> 
    {
        #region Entity Field Public Properties

<[Foreach EntityField CrLf]>        /// <summary>Get or set the <[EntityFieldName]> property that maps to the Entity <[CurrentEntityName]></summary>
        public virtual <[If GenerateAsNullableType]><[TypeOfField]>?<[Else]><[TypeOfField]><[EndIf]> <[EntityFieldName]> { get; set; }
<[NextForeach]>        
        #endregion

        #region Related Field Public Properties

<[ Foreach RelatedEntityField CrLf]>        /// <summary>Get or set the <[MappedFieldNameRelatedField]> property that maps to the Entity <[CurrentEntityName]>'s <[ MappedFieldNameRelation ]>.<[ RelatedEntityFieldName ]></summary>
        public virtual <[If GenerateAsNullableType]><[TypeOfField]>?<[Else]><[TypeOfField]><[EndIf]> <[ MappedFieldNameRelatedField ]> { get; private set; }<[NextForeach]>

        #endregion

        #region Custom Fields
        <[ UserCodeRegion "CustomFieldCode" ]>
        // __LLBLGENPRO_USER_CODE_REGION_START CustomFieldCode
        // __LLBLGENPRO_USER_CODE_REGION_END
        <[ EndUserCodeRegion ]>
        #endregion

        #region Ctors

        /// <summary>
        /// CTor
        /// </summary>
        public <[CurrentEntityName]>DTO()
        {        
        }

        /// <summary>
        /// CTor which initializes the DTO with values from its corresponding entity
        /// </summary>
        /// <param name="entityInstance">The entity instance which holds the values for this DTO</param>
        public <[CurrentEntityName]>DTO(<[CurrentEntityName]>Entity entityInstance) : this(entityInstance, new Hashtable(), new Hashtable()) { }

        internal <[CurrentEntityName]>DTO(<[CurrentEntityName]>Entity entityInstance, Hashtable seenObjects, Hashtable parents)<[ If IsSubType ]> : base(entityInstance, seenObjects, parents)<[ EndIf]>
        {
            FromEntity(entityInstance, seenObjects, parents);
        }

        #endregion

        /// <summary>
        /// Creates a <[CurrentEntityName]>DTO object from the given entity.
        /// </summary>
        public virtual IDTO<<[CurrentEntityName]>Entity> FromEntity(<[CurrentEntityName]>Entity entityInstance, Hashtable seenObjects, Hashtable parents)
        {
            <[ If IsSubType ]>base.FromEntity(entityInstance, seenObjects, parents);
            <[ EndIf]>seenObjects[entityInstance] = this;
            parents = new Hashtable(parents);
            parents.Add(entityInstance, null);

<[Foreach EntityField CrLf]>            this.<[EntityFieldName]> = entityInstance.<[EntityFieldName]>;<[NextForeach]>
<[Foreach RelatedEntityField CrLf]>            if (entityInstance.AlreadyFetched<[MappedFieldNameRelation]>)
                this.<[MappedFieldNameRelatedField]> = entityInstance.<[MappedFieldNameRelatedField]>;<[NextForeach]>
<[Foreach RelatedEntity OneToMany CrLf]><[If Not MappedFieldRelationIsHidden]>            if (entityInstance.AlreadyFetched<[MappedFieldNameRelation]>)
                <[MappedFieldNameRelation]> = RelatedArray<<[RelatedEntityName]>DTO, <[RelatedEntityName]>Entity>(entityInstance.<[MappedFieldNameRelation]>, seenObjects, parents);<[EndIf]><[NextForeach]>
<[Foreach RelatedEntity ManyToMany CrLf]><[If Not MappedFieldRelationIsHidden]>            if (entityInstance.AlreadyFetched<[MappedFieldNameRelation]>)
                <[MappedFieldNameRelation]> = RelatedArray<<[RelatedEntityName]>DTO, <[RelatedEntityName]>Entity>(entityInstance.<[MappedFieldNameRelation]>, seenObjects, parents);<[EndIf]><[NextForeach]>
<[Foreach RelatedEntity ManyToOne CrLf]><[If Not MappedFieldRelationIsHidden]>            if (entityInstance.AlreadyFetched<[MappedFieldNameRelation]>)
                <[MappedFieldNameRelation]> = RelatedObject<<[RelatedEntityName]>DTO, <[RelatedEntityName]>Entity>(entityInstance.<[MappedFieldNameRelation]>, seenObjects, parents);//(new <[RelatedEntityName]>DTO(entityInstance.<[MappedFieldNameRelation]>, seenObjects);<[EndIf]><[NextForeach]>
<[Foreach RelatedEntity OneToOne CrLf]><[If Not MappedFieldRelationIsHidden]>            if (entityInstance.AlreadyFetched<[MappedFieldNameRelation]>)
                <[MappedFieldNameRelation]> = RelatedObject<<[RelatedEntityName]>DTO, <[RelatedEntityName]>Entity>(entityInstance.<[MappedFieldNameRelation]>, seenObjects, parents);<[EndIf]><[NextForeach]>

            return this;
        }

        <[ If Not IsSubType ]>
        /// <summary>
        /// Get a collection of DTO objects created from entities related to <[CurrentEntityName]>Entity.
        /// It keeps track of entities previously seen to prevent an infinite loop.
        /// <summary>
        protected virtual T[] RelatedArray<T,U>(EntityCollectionBase<U> entities, Hashtable seenObjects, Hashtable parents) where T : class, IDTO<U>, new() where U : EntityBase
        {
            if (null == entities)
            {
                    return null;
            }

            T[] arr = new T[entities.Count];
            int i = 0;

            foreach (U entity in entities)
            {
                if (parents.Contains(entity))
                {
                    return null;
                }
            }

            foreach (U entity in entities)
            {
                if (seenObjects.Contains(entity))
                {
                    arr[i++] = seenObjects[entity] as T;
                }
                else
                {
                    arr[i++] = new T().FromEntity(entity, seenObjects, parents) as T;
                }
            }
            return arr;
        }

        /// <summary>
        /// Creates a DTO object from the given related <[CurrentEntityName]>Entity entity.
        /// This is used to populate a single DTO from a single relation of the <[CurrentEntityName]>Entity.
        /// <summary>
        protected virtual T RelatedObject<T,U>(U entityInstance, Hashtable seenObjects, Hashtable parents) where T : class, IDTO<U>, new() where U : EntityBase
        {
            if (null == entityInstance)
            {
                return null;
            }

            if (seenObjects.Contains(entityInstance))
            {
                if (parents.Contains(entityInstance))
                {
                    return null;
                }
                else
                {
                    return seenObjects[entityInstance] as T;
                }
            }

            return new T().FromEntity(entityInstance, seenObjects, parents) as T;
        }

        <[ EndIf]>
        /// <summary>
        /// Get a collection of individual DTO objects from the EntityCollectionBase<<[CurrentEntityName]>Entity> collection.
        /// <summary>
        public static <[CurrentEntityName]>DTO[] ToDTOArray(EntityCollectionBase<<[CurrentEntityName]>Entity> entities)
        {
            Hashtable seenObjects = new Hashtable();
            <[CurrentEntityName]>DTO[] arr = new <[CurrentEntityName]>DTO[entities.Count];
            for (int i = 0; i < entities.Count; i++)
            {
                arr[i] = new <[CurrentEntityName]>DTO().FromEntity(entities[i], seenObjects, new Hashtable()) as <[CurrentEntityName]>DTO;
            }
            return arr;
        }

        /// <summary>
        /// Creates a new entity instance and copies over the values of this DTO
        /// </summary>
        public <[ If IsSubType ]>override <[SuperTypeName]><[ Else]>virtual <[CurrentEntityName]><[ EndIf]>Entity ToEntity()
        {
            return ToEntity(new <[CurrentEntityName]>Entity());
        }

        /// <summary>
        /// Copies over the values of this DTO into the entity passed in. 
        /// Readonly fields on the entity are NOT copied to the entity from this DTO.
        /// </summary>
        public virtual <[CurrentEntityName]>Entity ToEntity(<[CurrentEntityName]>Entity toFill)
        {
<[Foreach EntityField CrLf]><[If IsReadOnly ]><[ Else ]>            toFill.<[EntityFieldName]> = this.<[EntityFieldName]>;<[ EndIf ]><[NextForeach]>

<[ If IsSubType ]>            base.ToEntity(toFill);<[ EndIf]>        
            return toFill;
        }

        #region Relation Fields

<[Foreach RelatedEntity OneToMany CrLf]><[If Not MappedFieldRelationIsHidden]>
        /// <summary> Gets the EntityCollectionBase with the related entities of type '<[RelatedEntityName]>Entity' which are related to this entity via a relation of type '1:n'.
        /// If the EntityCollectionBase hasn't been fetched yet, the collection returned will be empty.</summary>
        public virtual <[RelatedEntityName]>DTO[] <[MappedFieldNameRelation]> { get; set; }<[EndIf]><[NextForeach]>
<[Foreach RelatedEntity ManyToMany CrLf]><[If Not MappedFieldRelationIsHidden]>
        /// <summary> Gets the EntityCollectionBase with the related entities of type '<[RelatedEntityName]>Entity' which are related to this entity via a relation of type 'm:n'.
        /// If the EntityCollectionBase hasn't been fetched yet, the collection returned will be empty.</summary>
        public virtual <[RelatedEntityName]>DTO[] <[MappedFieldNameRelation]> { get; set; }<[EndIf]><[NextForeach]>
<[Foreach RelatedEntity ManyToOne CrLf]><[If Not MappedFieldRelationIsHidden]>
        /// <summary> Gets / sets related entity of type '<[RelatedEntityName]>Entity' which has to be set using a fetch action earlier. If no related entity
        /// is set for this property, null is returned. This property is not visible in databound grids.</summary>
        [Browsable(false)]
        public virtual <[RelatedEntityName]>DTO <[MappedFieldNameRelation]> { get; set; }<[EndIf]><[NextForeach]>
<[Foreach RelatedEntity OneToOne CrLf]><[If Not MappedFieldRelationIsHidden]>
        /// <summary> Gets / sets related entity of type '<[RelatedEntityName]>Entity' which has to be set using a fetch action earlier. If no related entity
        /// is set for this property, null is returned. This property is not visible in databound grids.</summary>
        [Browsable(false)]
        public virtual <[RelatedEntityName]>DTO <[MappedFieldNameRelation]> { get; set; }<[EndIf]><[NextForeach]>

        #endregion

        #region Custom DTO code
        <[ UserCodeRegion "CustomDTOCode" ]>
        // __LLBLGENPRO_USER_CODE_REGION_START CustomDTOCode
        // __LLBLGENPRO_USER_CODE_REGION_END
        <[ EndUserCodeRegion ]>
        #endregion
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using <[RootNamespace]>;
using <[RootNamespace]>.EntityClasses;
using <[RootNamespace]>.CollectionClasses;
using <[RootNamespace]>.DTOClasses;
using <[RootNamespace]>.HelperClasses;

namespace <[RootNamespace]>.DTOClasses
{
    /// <summary>
    /// Generates extension methods for converting Entities to DTOs
    /// This class is generated. Do not modify.
    /// </summary>
    public static <[If UsePartialClasses]>partial <[EndIf]>class Extensions
    {
<[If HasEntity]><[Foreach Entity]>
        /// <summary>Create a <[CurrentEntityName]> DTO from a <[CurrentEntityName]> entity</summary>
        /// <returns>The DTO created</returns>
        public static <[CurrentEntityName]>DTO ToDTO(this <[CurrentEntityName]>Entity entity)
        {
            <[CurrentEntityName]>DTO dto = null;
            if (entity != null)
                dto = new <[CurrentEntityName]>DTO(entity);
            return dto;
        }

        /// <summary>Create a list of <[CurrentEntityName]>DTO from a <[CurrentEntityName]>Collection</summary>
        /// <returns>The DTO list created</returns>
        public static List<<[CurrentEntityName]>DTO> ToDTOs(this <[CurrentEntityName]>Collection collection)
        {
            List<<[CurrentEntityName]>DTO> dtoList = new List<<[CurrentEntityName]>DTO>(collection.Count);
            foreach(<[CurrentEntityName]>Entity entity in collection)
                dtoList.Add(new <[CurrentEntityName]>DTO(entity));
            return dtoList;
        }

        /// <summary>Create a list of <[CurrentEntityName]>DTO from a List of <[CurrentEntityName]> entities</summary>
        /// <returns>The DTO list created</returns>
        public static List<<[CurrentEntityName]>DTO> ToDTOs(this List<<[CurrentEntityName]>Entity> entities)
        {
            return entities.ConvertAll<<[CurrentEntityName]>DTO>(e => new <[CurrentEntityName]>DTO(e));
        }

        /// <summary>From the queryable object, get a list of <[CurrentEntityName]>DTO</summary>
        /// <returns>The DTO list created</returns>
        public static List<<[CurrentEntityName]>DTO> ToDTOs(this IQueryable<<[CurrentEntityName]>Entity> queryableEntities)
        {
            return queryableEntities.ToList().ConvertAll<<[CurrentEntityName]>DTO>(e => new <[CurrentEntityName]>DTO(e));
        }

        /// <summary>From the queryable object, get a list of <[CurrentEntityName]>DTO</summary>
        /// <returns>The DTO list created</returns>
        public static <[CurrentEntityName]>DTO FirstDTO(this IQueryable<<[CurrentEntityName]>Entity> queryableEntities)
        {
            <[CurrentEntityName]>DTO dto = null;
            <[CurrentEntityName]>Entity firstEntity = queryableEntities.First();
            if (firstEntity != null)
                dto = new <[CurrentEntityName]>DTO(firstEntity);
            return dto;
        }
<[NextForeach]><[EndIf]>
        #region Custom code
        <[ UserCodeRegion "CustomDTOCode" ]>
        // __LLBLGENPRO_USER_CODE_REGION_START CustomDTOCode
        // __LLBLGENPRO_USER_CODE_REGION_END
        <[ EndUserCodeRegion ]>
        #endregion
    }
}
使用系统;
使用系统组件模型;
使用系统集合;
使用System.Runtime.Serialization;
使用.helper类;
使用.entityclass;
使用SD.LLBLGen.Pro.ORMSupportClasses;
namespace.DTOClasses
{
/// 
///DTO接口。
/// 
公共接口IDTO
{
T ToEntity(T toFill);
IDToFromEntity(T entityInstance,哈希表seenObjects,哈希表父项);
}
}
文件:entityDTO.template

using System;
using System.ComponentModel;
using System.Collections;
using System.Runtime.Serialization;

using <[RootNamespace]>.HelperClasses;
using <[RootNamespace]>.EntityClasses;

using SD.LLBLGen.Pro.ORMSupportClasses;

namespace <[RootNamespace]>.DTOClasses
{
    /// <summary>
    /// DTO interface.
    /// </summary>
    public interface IDTO<T>
    {
        T ToEntity(T toFill);
        IDTO<T> FromEntity(T entityInstance, Hashtable seenObjects, Hashtable parents);
    }
}
using System;
using System.ComponentModel;
using System.Collections;
using System.Runtime.Serialization;

using <[RootNamespace]>.HelperClasses;
using <[RootNamespace]>.EntityClasses;

using SD.LLBLGen.Pro.ORMSupportClasses;

namespace <[RootNamespace]>.DTOClasses
{
    <[ UserCodeRegion "AdditionalNamespaces" ]>
    // __LLBLGENPRO_USER_CODE_REGION_START AdditionalNamespaces
    // __LLBLGENPRO_USER_CODE_REGION_END
    <[ EndUserCodeRegion ]> 
    /// <summary>
    /// DTO class for the entity '<[CurrentEntityName]>'.
    /// </summary>
    [Serializable]
    public <[If UsePartialClasses]>partial <[EndIf]>class <[CurrentEntityName]>DTO : <[ If IsSubType ]><[ SuperTypeName ]>DTO, <[ EndIf]>IDTO<<[CurrentEntityName]>Entity><[ UserCodeRegion "AdditionalInterfaces" ]>
        // __LLBLGENPRO_USER_CODE_REGION_START AdditionalInterfaces
        // __LLBLGENPRO_USER_CODE_REGION_END
        <[ EndUserCodeRegion ]> 
    {
        #region Entity Field Public Properties

<[Foreach EntityField CrLf]>        /// <summary>Get or set the <[EntityFieldName]> property that maps to the Entity <[CurrentEntityName]></summary>
        public virtual <[If GenerateAsNullableType]><[TypeOfField]>?<[Else]><[TypeOfField]><[EndIf]> <[EntityFieldName]> { get; set; }
<[NextForeach]>        
        #endregion

        #region Related Field Public Properties

<[ Foreach RelatedEntityField CrLf]>        /// <summary>Get or set the <[MappedFieldNameRelatedField]> property that maps to the Entity <[CurrentEntityName]>'s <[ MappedFieldNameRelation ]>.<[ RelatedEntityFieldName ]></summary>
        public virtual <[If GenerateAsNullableType]><[TypeOfField]>?<[Else]><[TypeOfField]><[EndIf]> <[ MappedFieldNameRelatedField ]> { get; private set; }<[NextForeach]>

        #endregion

        #region Custom Fields
        <[ UserCodeRegion "CustomFieldCode" ]>
        // __LLBLGENPRO_USER_CODE_REGION_START CustomFieldCode
        // __LLBLGENPRO_USER_CODE_REGION_END
        <[ EndUserCodeRegion ]>
        #endregion

        #region Ctors

        /// <summary>
        /// CTor
        /// </summary>
        public <[CurrentEntityName]>DTO()
        {        
        }

        /// <summary>
        /// CTor which initializes the DTO with values from its corresponding entity
        /// </summary>
        /// <param name="entityInstance">The entity instance which holds the values for this DTO</param>
        public <[CurrentEntityName]>DTO(<[CurrentEntityName]>Entity entityInstance) : this(entityInstance, new Hashtable(), new Hashtable()) { }

        internal <[CurrentEntityName]>DTO(<[CurrentEntityName]>Entity entityInstance, Hashtable seenObjects, Hashtable parents)<[ If IsSubType ]> : base(entityInstance, seenObjects, parents)<[ EndIf]>
        {
            FromEntity(entityInstance, seenObjects, parents);
        }

        #endregion

        /// <summary>
        /// Creates a <[CurrentEntityName]>DTO object from the given entity.
        /// </summary>
        public virtual IDTO<<[CurrentEntityName]>Entity> FromEntity(<[CurrentEntityName]>Entity entityInstance, Hashtable seenObjects, Hashtable parents)
        {
            <[ If IsSubType ]>base.FromEntity(entityInstance, seenObjects, parents);
            <[ EndIf]>seenObjects[entityInstance] = this;
            parents = new Hashtable(parents);
            parents.Add(entityInstance, null);

<[Foreach EntityField CrLf]>            this.<[EntityFieldName]> = entityInstance.<[EntityFieldName]>;<[NextForeach]>
<[Foreach RelatedEntityField CrLf]>            if (entityInstance.AlreadyFetched<[MappedFieldNameRelation]>)
                this.<[MappedFieldNameRelatedField]> = entityInstance.<[MappedFieldNameRelatedField]>;<[NextForeach]>
<[Foreach RelatedEntity OneToMany CrLf]><[If Not MappedFieldRelationIsHidden]>            if (entityInstance.AlreadyFetched<[MappedFieldNameRelation]>)
                <[MappedFieldNameRelation]> = RelatedArray<<[RelatedEntityName]>DTO, <[RelatedEntityName]>Entity>(entityInstance.<[MappedFieldNameRelation]>, seenObjects, parents);<[EndIf]><[NextForeach]>
<[Foreach RelatedEntity ManyToMany CrLf]><[If Not MappedFieldRelationIsHidden]>            if (entityInstance.AlreadyFetched<[MappedFieldNameRelation]>)
                <[MappedFieldNameRelation]> = RelatedArray<<[RelatedEntityName]>DTO, <[RelatedEntityName]>Entity>(entityInstance.<[MappedFieldNameRelation]>, seenObjects, parents);<[EndIf]><[NextForeach]>
<[Foreach RelatedEntity ManyToOne CrLf]><[If Not MappedFieldRelationIsHidden]>            if (entityInstance.AlreadyFetched<[MappedFieldNameRelation]>)
                <[MappedFieldNameRelation]> = RelatedObject<<[RelatedEntityName]>DTO, <[RelatedEntityName]>Entity>(entityInstance.<[MappedFieldNameRelation]>, seenObjects, parents);//(new <[RelatedEntityName]>DTO(entityInstance.<[MappedFieldNameRelation]>, seenObjects);<[EndIf]><[NextForeach]>
<[Foreach RelatedEntity OneToOne CrLf]><[If Not MappedFieldRelationIsHidden]>            if (entityInstance.AlreadyFetched<[MappedFieldNameRelation]>)
                <[MappedFieldNameRelation]> = RelatedObject<<[RelatedEntityName]>DTO, <[RelatedEntityName]>Entity>(entityInstance.<[MappedFieldNameRelation]>, seenObjects, parents);<[EndIf]><[NextForeach]>

            return this;
        }

        <[ If Not IsSubType ]>
        /// <summary>
        /// Get a collection of DTO objects created from entities related to <[CurrentEntityName]>Entity.
        /// It keeps track of entities previously seen to prevent an infinite loop.
        /// <summary>
        protected virtual T[] RelatedArray<T,U>(EntityCollectionBase<U> entities, Hashtable seenObjects, Hashtable parents) where T : class, IDTO<U>, new() where U : EntityBase
        {
            if (null == entities)
            {
                    return null;
            }

            T[] arr = new T[entities.Count];
            int i = 0;

            foreach (U entity in entities)
            {
                if (parents.Contains(entity))
                {
                    return null;
                }
            }

            foreach (U entity in entities)
            {
                if (seenObjects.Contains(entity))
                {
                    arr[i++] = seenObjects[entity] as T;
                }
                else
                {
                    arr[i++] = new T().FromEntity(entity, seenObjects, parents) as T;
                }
            }
            return arr;
        }

        /// <summary>
        /// Creates a DTO object from the given related <[CurrentEntityName]>Entity entity.
        /// This is used to populate a single DTO from a single relation of the <[CurrentEntityName]>Entity.
        /// <summary>
        protected virtual T RelatedObject<T,U>(U entityInstance, Hashtable seenObjects, Hashtable parents) where T : class, IDTO<U>, new() where U : EntityBase
        {
            if (null == entityInstance)
            {
                return null;
            }

            if (seenObjects.Contains(entityInstance))
            {
                if (parents.Contains(entityInstance))
                {
                    return null;
                }
                else
                {
                    return seenObjects[entityInstance] as T;
                }
            }

            return new T().FromEntity(entityInstance, seenObjects, parents) as T;
        }

        <[ EndIf]>
        /// <summary>
        /// Get a collection of individual DTO objects from the EntityCollectionBase<<[CurrentEntityName]>Entity> collection.
        /// <summary>
        public static <[CurrentEntityName]>DTO[] ToDTOArray(EntityCollectionBase<<[CurrentEntityName]>Entity> entities)
        {
            Hashtable seenObjects = new Hashtable();
            <[CurrentEntityName]>DTO[] arr = new <[CurrentEntityName]>DTO[entities.Count];
            for (int i = 0; i < entities.Count; i++)
            {
                arr[i] = new <[CurrentEntityName]>DTO().FromEntity(entities[i], seenObjects, new Hashtable()) as <[CurrentEntityName]>DTO;
            }
            return arr;
        }

        /// <summary>
        /// Creates a new entity instance and copies over the values of this DTO
        /// </summary>
        public <[ If IsSubType ]>override <[SuperTypeName]><[ Else]>virtual <[CurrentEntityName]><[ EndIf]>Entity ToEntity()
        {
            return ToEntity(new <[CurrentEntityName]>Entity());
        }

        /// <summary>
        /// Copies over the values of this DTO into the entity passed in. 
        /// Readonly fields on the entity are NOT copied to the entity from this DTO.
        /// </summary>
        public virtual <[CurrentEntityName]>Entity ToEntity(<[CurrentEntityName]>Entity toFill)
        {
<[Foreach EntityField CrLf]><[If IsReadOnly ]><[ Else ]>            toFill.<[EntityFieldName]> = this.<[EntityFieldName]>;<[ EndIf ]><[NextForeach]>

<[ If IsSubType ]>            base.ToEntity(toFill);<[ EndIf]>        
            return toFill;
        }

        #region Relation Fields

<[Foreach RelatedEntity OneToMany CrLf]><[If Not MappedFieldRelationIsHidden]>
        /// <summary> Gets the EntityCollectionBase with the related entities of type '<[RelatedEntityName]>Entity' which are related to this entity via a relation of type '1:n'.
        /// If the EntityCollectionBase hasn't been fetched yet, the collection returned will be empty.</summary>
        public virtual <[RelatedEntityName]>DTO[] <[MappedFieldNameRelation]> { get; set; }<[EndIf]><[NextForeach]>
<[Foreach RelatedEntity ManyToMany CrLf]><[If Not MappedFieldRelationIsHidden]>
        /// <summary> Gets the EntityCollectionBase with the related entities of type '<[RelatedEntityName]>Entity' which are related to this entity via a relation of type 'm:n'.
        /// If the EntityCollectionBase hasn't been fetched yet, the collection returned will be empty.</summary>
        public virtual <[RelatedEntityName]>DTO[] <[MappedFieldNameRelation]> { get; set; }<[EndIf]><[NextForeach]>
<[Foreach RelatedEntity ManyToOne CrLf]><[If Not MappedFieldRelationIsHidden]>
        /// <summary> Gets / sets related entity of type '<[RelatedEntityName]>Entity' which has to be set using a fetch action earlier. If no related entity
        /// is set for this property, null is returned. This property is not visible in databound grids.</summary>
        [Browsable(false)]
        public virtual <[RelatedEntityName]>DTO <[MappedFieldNameRelation]> { get; set; }<[EndIf]><[NextForeach]>
<[Foreach RelatedEntity OneToOne CrLf]><[If Not MappedFieldRelationIsHidden]>
        /// <summary> Gets / sets related entity of type '<[RelatedEntityName]>Entity' which has to be set using a fetch action earlier. If no related entity
        /// is set for this property, null is returned. This property is not visible in databound grids.</summary>
        [Browsable(false)]
        public virtual <[RelatedEntityName]>DTO <[MappedFieldNameRelation]> { get; set; }<[EndIf]><[NextForeach]>

        #endregion

        #region Custom DTO code
        <[ UserCodeRegion "CustomDTOCode" ]>
        // __LLBLGENPRO_USER_CODE_REGION_START CustomDTOCode
        // __LLBLGENPRO_USER_CODE_REGION_END
        <[ EndUserCodeRegion ]>
        #endregion
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using <[RootNamespace]>;
using <[RootNamespace]>.EntityClasses;
using <[RootNamespace]>.CollectionClasses;
using <[RootNamespace]>.DTOClasses;
using <[RootNamespace]>.HelperClasses;

namespace <[RootNamespace]>.DTOClasses
{
    /// <summary>
    /// Generates extension methods for converting Entities to DTOs
    /// This class is generated. Do not modify.
    /// </summary>
    public static <[If UsePartialClasses]>partial <[EndIf]>class Extensions
    {
<[If HasEntity]><[Foreach Entity]>
        /// <summary>Create a <[CurrentEntityName]> DTO from a <[CurrentEntityName]> entity</summary>
        /// <returns>The DTO created</returns>
        public static <[CurrentEntityName]>DTO ToDTO(this <[CurrentEntityName]>Entity entity)
        {
            <[CurrentEntityName]>DTO dto = null;
            if (entity != null)
                dto = new <[CurrentEntityName]>DTO(entity);
            return dto;
        }

        /// <summary>Create a list of <[CurrentEntityName]>DTO from a <[CurrentEntityName]>Collection</summary>
        /// <returns>The DTO list created</returns>
        public static List<<[CurrentEntityName]>DTO> ToDTOs(this <[CurrentEntityName]>Collection collection)
        {
            List<<[CurrentEntityName]>DTO> dtoList = new List<<[CurrentEntityName]>DTO>(collection.Count);
            foreach(<[CurrentEntityName]>Entity entity in collection)
                dtoList.Add(new <[CurrentEntityName]>DTO(entity));
            return dtoList;
        }

        /// <summary>Create a list of <[CurrentEntityName]>DTO from a List of <[CurrentEntityName]> entities</summary>
        /// <returns>The DTO list created</returns>
        public static List<<[CurrentEntityName]>DTO> ToDTOs(this List<<[CurrentEntityName]>Entity> entities)
        {
            return entities.ConvertAll<<[CurrentEntityName]>DTO>(e => new <[CurrentEntityName]>DTO(e));
        }

        /// <summary>From the queryable object, get a list of <[CurrentEntityName]>DTO</summary>
        /// <returns>The DTO list created</returns>
        public static List<<[CurrentEntityName]>DTO> ToDTOs(this IQueryable<<[CurrentEntityName]>Entity> queryableEntities)
        {
            return queryableEntities.ToList().ConvertAll<<[CurrentEntityName]>DTO>(e => new <[CurrentEntityName]>DTO(e));
        }

        /// <summary>From the queryable object, get a list of <[CurrentEntityName]>DTO</summary>
        /// <returns>The DTO list created</returns>
        public static <[CurrentEntityName]>DTO FirstDTO(this IQueryable<<[CurrentEntityName]>Entity> queryableEntities)
        {
            <[CurrentEntityName]>DTO dto = null;
            <[CurrentEntityName]>Entity firstEntity = queryableEntities.First();
            if (firstEntity != null)
                dto = new <[CurrentEntityName]>DTO(firstEntity);
            return dto;
        }
<[NextForeach]><[EndIf]>
        #region Custom code
        <[ UserCodeRegion "CustomDTOCode" ]>
        // __LLBLGENPRO_USER_CODE_REGION_START CustomDTOCode
        // __LLBLGENPRO_USER_CODE_REGION_END
        <[ EndUserCodeRegion ]>
        #endregion
    }
}
使用系统;
使用系统组件模型;
使用系统集合;
使用System.Runtime.Serialization;
使用.helper类;
使用.entityclass;
使用SD.LLBLGen.Pro.ORMSupportClasses;
namespace.DTOClasses
{
//\u LLBLGENPRO\u用户\u代码\u区域\u启动附加名称空间
//\u LLBLGENPRO\u用户\u代码\u区域\u结束
/// 
///实体“”的DTO类。
/// 
[可序列化]
公共部分类DTO:DTO,IDTO
//\u LLBLGENPRO\u用户\u代码\u区域\u启动附加接口
//\u LLBLGENPRO\u用户\u代码\u区域\u结束
{
#区域实体字段公共属性
///获取或设置映射到实体的属性
公共虚拟机?{get;set;}
#端区
#区域相关字段公共属性
///获取或设置映射到实体的属性。
公共虚拟?{get;私有集;}
#端区
#区域自定义字段
//\ LLBLGENPRO\用户\代码\区域\开始自定义字段代码
//\u LLBLGENPRO\u用户\u代码\u区域\u结束
#端区
#区域系数
/// 
///执行器
/// 
公共DTO()
{        
}
/// 
///使用相应实体中的值初始化DTO的CTor
/// 
///保存此DTO值的实体实例
公共DTO(实体entityInstance):此(entityInstance,new Hashtable(),new Hashtable()){}
内部DTO(实体entityInstance,哈希表seenObjects,哈希表父级):基(entityInstance,seenObjects,父级)
{
FromEntity(entityInstance,请参见NoObjects,parents);
}
#端区
/// 
///从给定实体创建DTO对象。
/// 
公共虚拟ID到FromEntity(Entity entityInstance、哈希表seenObjects、哈希表父项)
{
base.FromEntity(entityInstance,请参见NoObjects,parents);
请参见nobjects[entityInstance]=此;
parents=新哈希表(parents);
parents.Add(entityInstance,null);
这个。=实体实例。;
if(entityInstance.AlreadyFetched)
这个。=实体实例。;
if(entityInstance.AlreadyFetched)
=RelatedArray(entityInstance.,请参见对象、父对象);
if(entityInstance.AlreadyFetched)
=RelatedArray(entityInstance.,请参见对象、父对象);
if(entityInstance.AlreadyFetched)
=RelatedObject(entityInstance.,SeeNoObjects,parents);/(新DTO(entityInstance.,SeeNoObjects);
if(entityInstance.AlreadyFetched)
=RelatedObject(entityInstance.,参见对象,父对象);
归还这个;
}
/// 
///获取从与实体相关的实体创建的DTO对象的集合。
///它跟踪以前看到的实体,以防止出现无限循环。
/// 
受保护的虚拟T[]RelatedArray(EntityCollectionBase实体、哈希表SeenObject、哈希表父级),其中T:class、IDTO、new(),其中U:EntityBase
{
if(null==实体)
{
返回null;
}
T[]arr=新的T[entities.Count];
int i=0;
foreach(实体中的U实体)
{
if(父项包含(实体))
{
返回null;
}
}
foreach(实体中的U实体)
{
if(参见nobjects.Contains(实体))
{
arr[i++]=将对象[entity]视为T;
}
其他的
{
arr[i++]=new T()。fromtentity(entity,seenObjects,parents)作为T;
}
}
返回arr;
}
/// 
///从给定的相关实体创建DTO对象。
///这用于从实体的单个关系填充单个DTO。
/// 
受保护的虚拟T RelatedObject(U entityInstance、哈希表seenObjects、哈希表父对象),其中T:class、IDTO、new(),其中U:EntityBase