NPoco/PetaPoco Fetch() 获取所有数据然后过滤客户端是否正常?

Is it normal for NPoco/PetaPoco Fetch() to get all data and then filter client side?

我注意到 NPoco(或 PetaPoco)的工作方式存在巨大差异,具体取决于您在使用 LINQ 时调用的函数。

例如比较 Fetch() 和 Query() 两者似乎做同样的事情:

A: Fetch<EntryImage>().Where(t => t.EntryType == type && t.EntryID == entryID);

B: Query<EntryImage>().Where(t => t.EntryType == type && t.EntryID == entryID);

A returns table (10,000+) 中的每一行,然后过滤客户端。

B returns 只是我期待的 one 行。

我发现这种行为非常危险 - 很容易编写出性能非常糟糕的代码,而晚上却没有注意到。这是预期的行为吗?如果这是正常行为,是否有任何方法可以获取以这种方式工作的方法列表,以便我可以尽可能避免使用它们?

这是 NPoco 的预期行为。

根据来源:

Fetch returns 一个列表。

    /// <summary>
    /// Fetch all objects of type T from the database using the conventions or configuration on the type T. 
    /// Caution: This will retrieve ALL objects in the table
    /// </summary>
    List<T> Fetch<T>();

Query returns IQueryProviderWithIncludes(类似于IQueryable

    /// <summary>
    /// Entry point for LINQ queries
    /// </summary>
    IQueryProviderWithIncludes<T> Query<T>();

如果您使用的是 PetaPoco (*),初始代码示例都不是很好 - 但问题是 不是 获取与查询。

在这两种情况下,提交给服务器的 SQL 基本上是 "SELECT * FROM EntryImage"(运行 一个 sql 跟踪并确认如果您不确定) .

Fetch vs Query 不会改变发送到服务器的 SQL - 它只会改变数据在客户端的服务方式(即作为列表或通过 yield 的延迟执行 IEnumerable)。

做你想做的,查看 PetaPoco's documentation :

var sql=PetaPoco.Sql.Builder()
            .Select("*")
            .From("articles")
            .Where("date_created < @0", DateTime.UtcNow) // fluent Where clause
            .OrderBy("date_created DESC");

(*) 如果您使用的是 NPoco,请参阅 以获得答案。