当Linq延迟执行时,到底是和数据库交互多少次?

shingo1017 2008-03-12 03:26:02

InteranceDB dB = new InteranceDB();
IEnumerable<Entity.Relation> relations;

relations = dB.Relations.Where(r => r.fldToID == instanceID);
relations = relations.Where(r => r.fldFromID == instanceIDFromTo);
relations = relations.Where(r => r.fldRelationTypeID == (int)relationTypeID);

int count = relations.Count();

如上代码,在最后取得count时进行延迟执行,但是到底是从数据库中查询了几次呢? 1次还是3次?
望达人指点!!
...全文
342 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hellonet123 2008-07-29
  • 打赏
  • 举报
回复

InteranceDB dB = new InteranceDB();
IEnumerable<Entity.Relation> relations;
relations = dB.Relations.Where(r => r.fldToID == instanceID);
relations = relations.Where(r => r.fldFromID == instanceIDFromTo);
relations = relations.Where(r => r.fldRelationTypeID == (int)relationTypeID);
//这是的result仅仅是一个查询描述,并不是查询结果,现在并没有真正的进行查询。
//result在这里是一个IQueryable强类型的数据结构。
//前面那三个语句仅仅是对查询描述的修改。
int count = relations.Count();
//relations.Count()会导致IQueryable上的方法GetEnumerator()执行,从而导致查询的执行。

就像这位大哥说的一样.我认为应该是一次,int count = relations.Count();//这里
zj_2009 2008-07-24
  • 打赏
  • 举报
回复
那肯定是执行一次啊。

楼主这也要问吗
SlaughtChen 2008-07-24
  • 打赏
  • 举报
回复
又学习了一下 LINQ
purple_tide 2008-03-24
  • 打赏
  • 举报
回复
多少次?
这个看SQL事件探察器就好了
  • 打赏
  • 举报
回复
你可以在使用Linq to SQL时在表达式中写上根本不可能在一个SQL语句(向SQL Server服务器发送的命令)中加入的操作,例如需要引用内存中的对象的属性甚至方法返回值,但是Linq to SQL可以规划和完成查询过程并返回正确结果。因此,不能把一次“导致查询的执行”简单看成“和数据库交互一次”,而应该实际去运行一些复杂的看上去单一一条SQL语句无法执行的linq查询表达式。
消瘦的锁骨浩 2008-03-21
  • 打赏
  • 举报
回复
交互一次,

InteranceDB dB = new InteranceDB();
IEnumerable<Entity.Relation> relations;
relations = dB.Relations.Where(r => r.fldToID == instanceID);
relations = relations.Where(r => r.fldFromID == instanceIDFromTo);
relations = relations.Where(r => r.fldRelationTypeID == (int)relationTypeID);
//这是的result仅仅是一个查询描述,并不是查询结果,现在并没有真正的进行查询。
//result在这里是一个IQueryable强类型的数据结构。
//前面那三个语句仅仅是对查询描述的修改。
int count = relations.Count();
//relations.Count()会导致IQueryable上的方法GetEnumerator()执行,从而导致查询的执行。
消瘦的锁骨浩 2008-03-21
  • 打赏
  • 举报
回复
交互一次,

InteranceDB dB = new InteranceDB();
IEnumerable<Entity.Relation> relations;
relations = dB.Relations.Where(r => r.fldToID == instanceID);
relations = relations.Where(r => r.fldFromID == instanceIDFromTo);
relations = relations.Where(r => r.fldRelationTypeID == (int)relationTypeID);
//这是的result仅仅是一个查询描述,并不是查询结果,现在并没有真正的进行查询。
//result在这里是一个IQueryable强类型的数据结构。
//前面那三个语句仅仅是对查询描述的修改。
int count = relations.Count();
//relations.Count()会导致IQueryable上的方法GetEnumerator()执行,从而导致查询的执行。
  • 打赏
  • 举报
回复
如果你用一个Linq查询来“代替一条SQL语句”,就把Linq用得很窄了。
  • 打赏
  • 举报
回复
不是“执行一次”的问题,而是“查询多少次”的问题。

“只在需要数据的时候才查询”并没有说“只在需要数据的时候才查询1次”。一条挺简单的表达式可能在执行时需要查询数据库上千次这并不稀奇,并不是一定“只查询一次”。
xray2005 2008-03-12
  • 打赏
  • 举报
回复
按照linq的说话,只在需要数据的时候才查询.
那么,我觉得可能只是int count = relations.Count();这个地方count()的时候才执行一次.
  • 打赏
  • 举报
回复
不同的 Linq Provider 各自按照自己的方式规划查询行为,而Linq查询代码则基本上完全一样,则就是Linq最好的地方,它是足够高级的语言。

即使对SQL Server来说,一个不太复杂、不太长的查询语句可能访问数据库1次,也可能访问1000次,这是不一定的。你可以写一条能够让SQL Server查询上千次的Linq来试一试。一个表达式的一次执行与访问几次数据库没有固定的对应关系。
shingo1017 2008-03-12
  • 打赏
  • 举报
回复
自己查了一下log,是执行1次的,结贴
内容概要:本文详细介绍了C#中的LINQ查询及其在面向对象编程中的高效数据处理应用。首先阐述了C#面向对象编程的基础,包括类和对象、继承与多态、封装与抽象等核心概念。接着深入探讨了LINQ查询技术,解释了其统一查询语法、类型安全、延迟执行和可组合性的优势。文章通过丰富的示例展示了LINQ查询语法和方法语法的使用,涵盖筛选、排序、分组、联接和聚合等常见操作。此外,还介绍了LINQ数据库交互的方式,包括LINQ to SQL和Entity Framework的使用方法,以及执行复杂数据库查询的技巧。最后,通过实战案例分析,展示了LINQ在实际项目中的应用,并针对性能、类型推断和数据库查询优化等问题提出了解决方案,同分享了最佳实践和编码规范。 适合人群:具备一定C#编程基础,希望深入了解LINQ查询技术并提高数据处理能力的研发人员。 使用场景及目标:①掌握C#面向对象编程的核心概念,如类、继承、多态、封装和抽象;②学会使用LINQ查询技术处理内存中的集合和数据库数据;③理解并应用LINQ查询的优化技巧,提升程序性能;④遵循最佳实践和编码规范,确保代码的可读性和可维护性。 阅读建议:本文内容丰富,建议读者结合实际项目逐步学习和实践,特别关注LINQ查询的实际应用场景和优化技巧。通过动手编写和调试代码,加深对LINQ的理解和应用。

8,493

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧