使用DTO在Entity Framework中延迟加载

时间:2014-04-28 02:11:28

标签: c# entity-framework

我对使用实体框架的延迟加载功能所遇到的这个问题感到非常困惑。 我知道触发数据库查询的扩展名,如.ToList(),. Count()等。 我的问题是,如果你使用IEnumerable DTO作为返回类型,这会触发数据库查询吗?

示例您有以下DTO:

public DtoUser
{
   public string Name { get; set; }
   public int Age { get; set; }
}

我在您的业务层上使用此方法:

public BLLUser
{
   public IEnumerable<User> GetAllUser
   {
      var output = from u in context.User
                   select new DtoUser
                   {
                      Name = u.Name,
                      Age = u.Age
                   };
   }
}

我将其称为:

private void GetUserOnBll()
{
    using (BLLUser b = new BLLUser())
    {
       var dtoUser = b.GetAllUser();

       // can I still do this without triggering the database query
       // or the query is already been triggered
       // since the return type is an IEnumerable DTO
       var filtered = dtoUser.Where(n => n.Name == "TEST");
    }
}

将&#34; b.GetUser()&#34;方法会触发数据库查询还是我必须使用.ToList()来触发查询?

2 个答案:

答案 0 :(得分:1)

b.GetUser()不会触发数据库查询,NEITHER dtoUser.Where(n => n.Name == "TEST")将触发查询。不同的执行意味着只有在“使用”它时才会执行db查询,例如foreach子句或SingleOrDefault()/ Count()/ ...

所以你上面的程序会做你想要的。但是会出现性能问题。生成的SQL会喜欢 Select Name, Age from User 它将从数据库中获取所有记录到内存中,在内存中进行过滤然后返回过滤后的记录。如果要在数据库端进行过滤,则应将IEnumerable替换为IQueryable

答案 1 :(得分:0)

创建DtoUser List列表的原则

并通过在构造函数中调用函数来赋值。如果您需要示例代码,请告诉我。

另一件事我不知道你如何调用并获取上下文我建议使用IQueryable而不是IEnumerable因为数据库中的IQueryable句柄和服务器内存上的IEnumerable句柄。

问候 Pubudu