当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次?
望达人指点!!
...全文
335 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次的,结贴

8,497

社区成员

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

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