我注意到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 只返回我期待的一个行。
我发现这种行为非常危险 - 如果没有真正的傍晚注意,编写性能非常差的代码会非常容易。这是预期的行为吗?如果这是正常行为,有没有办法获得以这种方式工作的方法列表,所以我可以避免在可能的情况下使用它们?
答案 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了解答案。