Fetch 和 Query 有啥区别?

Posted

技术标签:

【中文标题】Fetch 和 Query 有啥区别?【英文标题】:What is the difference between Fetch and Query?Fetch 和 Query 有什么区别? 【发布时间】:2014-07-26 10:15:50 【问题描述】:

对我来说,PetaPoco 的 Database.FetchDatabase.Query 似乎在做同样的事情。

例如,

var db = new PetaPoco.Database("myDB");
ProductList products = db.Fetch<ProductList>("SELECT * FROM ProductList");
ProductList products = db.Query<ProductList>("SELECT * FROM ProductList");

它们之间有什么明显的区别吗?

【问题讨论】:

那和sql server有什么关系?检查 petapoco 文档。 【参考方案1】:

根据PetaPoco documentation,答案是这样的:

查询与提取

Database 类有两种检索记录的方法 Query 和 Fetch。除了 Fetch 返回 POCO 的 List 之外,这些几乎相同,而 Query 使用 yield return 来迭代结果而不将整个集合加载到内存中。

【讨论】:

有没有办法禁用通过获取整个数据集然后过滤客户端来工作的方法?这太危险了(从性能的角度来看),我什至不希望这些方法可供我使用。 @NickG - 我怀疑这就是这里的建议。我很确定所有过滤都是在服务器端完成的。这只是结果是在IEnumerable&lt;T&gt; 中产生还是加载到List&lt;T&gt; 中的问题 @Jim 我已经通过 Trace 确认过滤没有在服务器端完成,并将整个表交给 .NET 以在客户端进行过滤。因此,应尽可能避免使用 Fetch 并优先使用 Query。在这里查看我自己的问题:***.com/questions/38128988/… 我同意。我几乎希望我可以为这些方法启用编译器警告(或通过配置禁用它们)。我检查了一些旧代码,发现我在几个地方使用了 Fetch。我真的看不出这种方法的意义——查询肯定会更好? Fetch 肯定有它的用途。因为它返回一个列表,而不是一个 IEnumerable,所以你会得到一些好处。主要好处是您可以在列表上进行多次迭代(例如调用 .Count() 或 foreach 等),而无需多次执行 SQL。【参考方案2】:

如果您在事务中使用它们,获取和查询的行为会有所不同。我有一个用例,我需要在一个事务中更新多个表,但我需要从序列中间的引用表中检索一些数据。

当我使用 Query 检索数据时,随后的插入或更新失败并出现 InvalidOperationException:“已经有一个打开的 DataReader 与此命令关联,必须先关闭”

解决方案是用 Fetch 替换 Query,我能够完成序列。

这个的伪代码是:

BeginTransaction Update Tbl1 Update Tbl2 Query RefTblA ## Changed Query to Fetch to avoid: '...already an open DataReader..." exception Update Tbl3 using data from RefTblA CompleteTransaction

【讨论】:

以上是关于Fetch 和 Query 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

fetch 和 jquery ajax 有啥区别?

Axios 和 Fetch 有啥区别?

Git配置文件中的fetch和branch有啥区别

学说中 fetch="EAGER" 和 fetch="LAZY" 有啥区别

git branch、fork、fetch、merge、rebase 和 clone 有啥区别?

`isomorphic-fetch` 和 `isomorphic-unfetch` npm 包有啥区别