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

时间:2016-06-30 16:42:35

标签: linq petapoco npoco

我注意到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 会返回表格中的每一行(10,000+),然后过滤客户端。

B 只返回我期待的一个行。

我发现这种行为非常危险 - 如果没有真正的傍晚注意,编写性能非常差的代码会非常容易。这是预期的行为吗?如果这是正常行为,有没有办法获得以这种方式工作的方法列表,所以我可以避免在可能的情况下使用它们?

2 个答案:

答案 0 :(得分: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>();

Query返回IQueryProviderWithIncludes(类似于IQueryable

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

答案 1 :(得分:0)

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

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

Fetch vs Query不会改变发送到服务器的SQL - 它只是改变了客户端如何提供数据(即作为List或延迟执行IEnumerable via yield)。

要做你想做的事,请查看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,请参阅above了解答案。