C#LINQ:linq查询是否仅返回延迟枚举?

时间:2019-04-22 10:42:48

标签: c# .net lambda .net-core

我有方法

  

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都应该相同。 有人可以确认一下吗?

1 个答案:

答案 0 :(得分:0)

选项B很快,因为它可以一次性获取经过过滤的数据。

A将根据条件检索所有数据,然后将根据类别进行过滤。它有可能最终会检索意外的数据。

编辑:

在存储过程中,它的行为方式将很有趣。

如果您有权访问事件探查器,那么很容易检查什么是最终的SQL语句回退到sqlserver以便执行。

我不太确定实体框架的内部机制。

但是从您的代码中,我认为要实现相同的目的,编译器/ EF必须在后台执行两次操作。