我有方法
GetPostsByCategory
我可以像方法A一样重用我已有的东西
A
public IEnumerable<Post> GetPostsByApartmentId(
string apartmentId,
int pageIndex,
int pageSize,
int max = 50)
{
var itemsPerPage = Math.Max(pageSize, max);
return _context.Post
.Where(p => p.ApartmentId == apartmentId && !p.Disabled)
.Skip((pageIndex - 1) * itemsPerPage)
.Take(itemsPerPage);
}
public IEnumerable<Post> GetPostsByCategory(
string categoryId,
string apartmentId,
int pageIndex,
int pageSize,
int max = 50)
{
return GetPostsByApartmentId(apartmentId, pageIndex, pageSize, max)
.Where(p => p.CategoryId == categoryId);
}
但是,我担心A的性能, 所以这是 B
public IEnumerable<Post> GetPostsByCategory(
string categoryId,
string apartmentId,
int pageIndex,
int pageSize,
int max)
{
var itemsPerPage = Math.Max(pageSize, max);
return _context.Post
.Where(p => p.ApartmentId == apartmentId && !p.Disabled && p.CategoryId == categoryId)
.Skip((pageIndex - 1) * itemsPerPage)
.Take(itemsPerPage);
}
但是,我记得我读过一些文章说:Lambda Expression(或LINQ,不记得了)并没有真正执行查询,它只是构造查询,并且仅在需要时或通过调用某些内容才执行像ToList()。 因此,如果是这种情况,那么A和B都应该相同。 有人可以确认一下吗?
答案 0 :(得分:0)
选项B很快,因为它可以一次性获取经过过滤的数据。
A将根据条件检索所有数据,然后将根据类别进行过滤。它有可能最终会检索意外的数据。
编辑:
在存储过程中,它的行为方式将很有趣。
如果您有权访问事件探查器,那么很容易检查什么是最终的SQL语句回退到sqlserver以便执行。
我不太确定实体框架的内部机制。
但是从您的代码中,我认为要实现相同的目的,编译器/ EF必须在后台执行两次操作。