我对使用实体框架的延迟加载功能所遇到的这个问题感到非常困惑。 我知道触发数据库查询的扩展名,如.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()来触发查询?
答案 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