Fetch 和 Query 有啥区别?
Posted
技术标签:
【中文标题】Fetch 和 Query 有啥区别?【英文标题】:What is the difference between Fetch and Query?Fetch 和 Query 有什么区别? 【发布时间】:2014-07-26 10:15:50 【问题描述】:对我来说,PetaPoco 的 Database.Fetch
和 Database.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<T>
中产生还是加载到List<T>
中的问题
@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="EAGER" 和 fetch="LAZY" 有啥区别