当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次?
望达人指点!!
...全文
402 12 打赏 收藏 举报
写回复
用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次的,结贴
代码转载自:https://pan.quark.cn/s/c50a500cf555 在当今全球经济迅猛增长的背景下,通讯技术的持续进步使得个人之间的联系日益紧密,因此个人对其联系人信息的有效管理变得尤为重要。在此需求下,通讯录应运而生,各式各样的通讯录应用正不断为人们的生活带来便利。通讯录管理软件主要用于处理日常生活中的同学、朋友等联系人的信息编辑,帮助用户随时获取所需联系人的全部资料。这款通讯录管理系统操作简便,用户能够通过该系统轻松完成添加、检索、更新、移除等基本的管理任务。软件的操作界面通常可以隐藏在屏幕的边缘区域,当用户的鼠标移至该区域时,操作界面会自动显现,用户仅需输入关键词(如联系人姓名)即可快速找到所需的通讯录数据。 【Java课程设计-通讯录系统】是一款基于Java编程语言开发的个人通讯录管理工具,其目的是协助用户高效地处理和查找联系人信息。该系统是在JDK 1.7.0和NetBeans 6.9.1集成开发环境中构建的,提供了添加、检索、修改和删除联系人等核心功能,旨在为用户提供流畅的操作体验。 ### 一、需求分析 1. **基本功能**:系统需具备存储联系人姓名、电话、电子邮箱等核心数据的能力,并支持用户执行新增联系人、查找特定联系人、编辑现有联系人资料以及移除无用联系人等操作。 2. **搜索功能**:用户通过输入联系人姓名的关键字,系统能迅速定位到对应的联系人记录。 3. **界面友好**:界面设计需简洁明了,操作直观易用,软件窗口支持隐藏于屏幕边缘,并在鼠标接近时自动展示。 4. **数据保存**:系统必须实现联系人数据的持久化存储,确保程序关闭后数据不会丢失。 ### 二、任务分析 1. **主界面设计**:开发一个用户友好的主界...

8,492

社区成员

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

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