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,请参阅 以获得答案。
我注意到 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,请参阅