回答

收藏

通过IQueryable循环与使用C#中的Reader.Read()通过Datareader循环相同

技术问答 技术问答 218 人阅读 | 0 人回复 | 2023-09-12

对不起,长标题1 s9 H7 T2 n: h0 n3 `; g
我真的找不到答案。这个问题已经绕过我一段时间了。最后是问题的简短摘要。
/ s$ m6 w& a. i- X- u! b基本上,我想知道linq到实体/ sql是否将结果集映射到实体/! h8 o" d& K7 X9 `# s. z
sql数据读取器循环之前已经映射过一个类别或一个。我可以经历它Iqueryable之前,Iqueryable数据读取器是否必须遍历。为了显示我在代码中的意思,我想知道是否
2 r" |% z$ _  g: w$ S. ]5 q, h. Tforeach(object o in SomeIQueryableObject){    ...do stuff with the object}将导致A:
8 M+ i2 G2 g) |# u2 j% T4 b( G    while(Reader.Read(){      SomeIqueryableObject.Add(Reader.TranslateRow();now the iqueryable has been loaded with objects and we can loop through it//with the above codeforeach(object o in SomeIQueryableObject){    ...do stuff with the object}否则会导致B:$ `" W. J4 \3 Z1 D
while(Reader.Read(){     ...do stuff with the object}//Iqueryable doesn't have to loop through Reader//before you can loop through Iqueryable.当我在的时候iqueryable上使用foreach是否等同于使用Reader.Read()遍历数据读取器, O% r# e( K5 Q  y2 T/ \) b
                                                               
; }1 a" y2 `; J% {, @+ [! {    解决方案:                                                                3 g$ L( l. `! ^6 k% p# T( T) j
                                                                AFAIK
4 l) e" p; V8 t" _3 Z: MEF使用您的第二个选项。这是因为我经历过EF第二个连接将在循环浏览第一个查询结果时打开。由于我正在使用事务,我禁止分布式事务,第二个打开连接(虽然第一个连接仍在打开和使用)禁止当前事务的重用,所以我的第二个查询抛出了一个异常,说DTC不是未启用。$ ^9 ~! T1 n9 C. E8 F- b6 a7 ]
因此,我的结论是:如果您正在执行查询和遍历结果(因此no
- ?8 J. j" G- s/ n: s% |.ToList(),查询仍在执行,连接仍在打开,如果EF在从数据读取器读取的循环中,使用数据读取器。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则