Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取和查询之间有什么区别?_C#_Petapoco - Fatal编程技术网

C# 获取和查询之间有什么区别?

C# 获取和查询之间有什么区别?,c#,petapoco,C#,Petapoco,对我来说,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 Produ

对我来说,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");
它们之间有什么显著的区别吗?

根据,答案如下:

查询与获取

数据库类有两种用于检索记录、查询和获取的方法。除了Fetch返回一个POCO的列表外,它们几乎相同,而Query使用yield-return迭代结果,而不将整个集合加载到内存中


如果在事务中使用Fetch和query,则它们的行为会有所不同。我有一个用例,我需要更新一个事务中的几个表,但是我需要从序列中间的一个引用表中检索一些数据。 当我通过查询检索数据时,随后的插入或更新失败,出现InvalidOperationException:已经有一个打开的DataReader与此命令关联,必须先关闭它

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

此操作的伪代码为:

开始换药 更新Tbl1 更新Tbl2 Query RefTblA已更改要获取的查询以避免:“…已打开DataReader。。。例外 使用RefTblA中的数据更新Tbl3 络合作用

这与sql server有什么关系?查看petapoco文档。有没有办法通过获取整个数据集然后过滤客户端来禁用这些方法?从性能的角度来看,这是非常危险的,我甚至不希望这些方法对我有用。@NickG-我怀疑这里所建议的是什么。我确信所有的过滤都是在服务器端完成的。这只是一个结果是在IEnumerable中生成还是加载到IEnumerable中的问题List@Jim我已经通过跟踪确认,过滤没有在服务器端完成,并将整个表交给.NET进行客户端过滤。因此,应尽可能避免提取,并优先使用查询。请看我自己的问题:我同意。我几乎希望能够为这些方法启用编译器警告,或者通过配置禁用它们。我检查了一些旧代码,发现我在几个地方使用过Fetch。我真的看不出这个方法的意义-查询肯定会更好?Fetch肯定有它的用途。因为它返回的是一个列表,而不是IEnumerable,所以您可以得到一些好处。主要的好处是,您可以对列表进行多次迭代,例如调用.Count或foreach等,而无需多次执行SQL。