使用LINQ-to-Entities时,将结果从业务层返回到表示层的最佳方法

时间:2010-04-10 14:40:33

标签: c# entity-framework

我有一个业务层,其中包含在表示层中使用的DTO。该应用程序使用实体框架。

以下是名为RoleDTO的类的示例:

public class RoleDTO
{
    public Guid RoleId { get; set; }
    public string RoleName { get; set; }
    public string RoleDescription { get; set; }
    public int? OrganizationId { get; set; } 
}

在BLL中我想要一个返回DTO列表的方法。我想知道哪种方法更好:返回IQueryable或DTO列表。虽然我认为返回IQueryable不是一个好主意,因为连接需要打开。以下是使用不同方法的两种不同方法:

第一种方法

public class RoleBLL
{
    private servicedeskEntities sde;

    public RoleBLL()
    {
        sde = new servicedeskEntities();
    }

    public  IQueryable<RoleDTO> GetAllRoles()
    {
        IQueryable<RoleDTO> role = from r in sde.Roles
                        select new RoleDTO()
                        {
                            RoleId = r.RoleID,
                            RoleName = r.RoleName,
                            RoleDescription = r.RoleDescription,
                            OrganizationId = r.OrganizationId
                        };
        return role;
    }

注意:在上面的方法中,DataContext是一个私有属性,并在构造函数中设置,以便连接保持打开状态。

第二种方法

public static List<RoleDTO> GetAllRoles()
{
    List<RoleDTO> roleDTO = new List<RoleDTO>();
    using (servicedeskEntities sde = new servicedeskEntities())
    {
        var roles = from pri in sde.Roles
                         select new { pri.RoleID, pri.RoleName, pri.RoleDescription };

        //Add the role entites to the DTO list and return. This is necessary as anonymous types can be returned acrosss methods
        foreach (var item in roles)
        {
            RoleDTO roleItem = new RoleDTO();
            roleItem.RoleId = item.RoleID;
            roleItem.RoleDescription = item.RoleDescription;
            roleItem.RoleName = item.RoleName;
            roleDTO.Add(roleItem);

        }
        return roleDTO;
    }
}

如果有更好的方法,请告诉我。

1 个答案:

答案 0 :(得分:1)

最好不要将模型对象直接发送到表示层,您可以使用中间层将这些DTO对象映射到表示层所需的自定义对象。

这接近你的第二种方法,但不完全相同。