【问题标题】:Is it normal for NPoco/PetaPoco Fetch() to get all data and then filter client side?NPoco/PetaPoco Fetch() 获取所有数据然后过滤客户端是否正常?
【发布时间】:2016-11-02 21:30:47
【问题描述】:

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

例如比较 Fetch() 哪个 Query() 看起来都在做同样的事情:

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

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

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

B 只返回我期望的 one 行。

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

【问题讨论】:

    标签: linq petapoco npoco


    【解决方案1】:

    这是 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>();
    

    【讨论】:

    • 这太危险了。如果你调用这些方法中的任何一个,我希望有一个 NPoco 配置选项来引发异常,这样你就可以避免意外使用它们。
    • @NickG 你可以编写一个 Roslyn 分析器来监视代码库中的Fetch,并将警告级别设置为错误,使其编译失败。
    • NPoco 的好答案——我也喜欢源代码链接!
    【解决方案2】:

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

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

    Fetch vs Query 不会改变发送到服务器的 SQL - 它只是改变数据在客户端的服务方式(即作为 List 或通过 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,请参阅above 以获得答案。

    【讨论】:

    • 好的 - 现在 PetaPoco 的行为似乎与 NPoco 完全不同(参见 Albert 的回答)。我不应该在我的问题中提到这两个:(
    猜你喜欢
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    相关资源
    最近更新 更多