4

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

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

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

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

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

B只返回我期望的一行

我发现这种行为非常危险——很容易编写性能非常糟糕的代码而不会真正注意到晚上。这是预期的行为吗?如果这是正常行为,有没有办法获得以这种方式工作的方法列表,所以我可以尽可能避免使用它们?

4

2 回答 2

4

这是 NPoco 的预期行为。

根据来源:

Fetch返回一个列表。

    /// <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>();

查询返回 IQueryProviderWithIncludes(类似于IQueryable

    /// <summary>
    /// Entry point for LINQ queries
    /// </summary>
    IQueryProviderWithIncludes<T> Query<T>();
于 2016-07-03T20:05:35.353 回答
1

如果您使用的是 PetaPoco (*),那么初始代码示例都不是很好 - 但问题在于Fetch 与 Query。

在这两种情况下,提交给服务器的 SQL 基本上都是“SELECT * FROM EntryImage”(如果不确定,请运行 sql 跟踪并确认)。

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

做你想做的事,查看PetaPoco 的文档

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

(*) 如果您使用的是 NPoco,请参阅上面的答案。

于 2017-05-31T00:17:49.443 回答