【发布时间】:2019-09-11 13:38:51
【问题描述】:
我有一个方法
按类别获取帖子
我可以像方法 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 表达式(或 LINQ,不记得了)并没有真正执行查询,它只是构造查询,并且只有在需要时或通过调用某些东西时才会执行像 ToList()。 因此,如果是这种情况,那么 A 和 B 应该是相同的。 有人可以确认一下吗?
【问题讨论】:
-
为什么要关注性能?究竟表现什么,一个额外的方法调用?您是否尝试过测量差异?
-
看起来你正在使用实体框架,并且返回一个 IEnumerable 实现结果。您的实际问题是“如何扩展 Where 语句”?
-
我认为如果将
GetPostsByApartmentId的返回类型更改为IQueryable<Post>,A和B之间几乎没有区别/跨度> -
您应该首先问一个更重要的问题:方法 A 是否返回与方法 B 相同的结果?我怀疑它没有。产生正确结果的慢代码总是比产生错误结果的快代码更可取。