2012-12-19 42 views
1

我正在使用CoolStorage作为ORM并且有一个关于查询数据库频率的问题。LINQ如何得到它的结果

我要返回一个团队列表,并且还想显示每个团队中包含的用户数。我通过致电Team.List()返回团队,并且我可以考虑如何返回用户数量的2个选项。一种方法是向Team类中添加一个属性,该类返回其[OneToMany] SysUsers的计数,另一个是对由Team.List()返回的结果使用LINQ。下面的代码演示了两种方法,它们都返回相同的结果。

我想了解如何影响数据库的交互,例如将它先回队的名单,然后运行对每一个单独的查询来获取用户的数量?如果我然后想添加另外的2或3个字段,它会为每个额外的字段运行另一个单独的查询吗?这两种方法有什么区别?

我的问题是,如果连接不好,这可能会使简单的查询无法响应。

的选项CoolStorage存在运行即席SQL查询,而不是,我是不是过得更好,而不是做这行更复杂的查询?还是我担心什么都没有?

CSList<Team> teams = Team.List(); 

// Counting number of objects 
var d = from t in teams 
     select new 
     { 
      TeamID = t.TeamID, 
      TeamName = t.TeamName, 
      NoUsers = t.SysuserTeams.Count 
     }; 

// Using property added to Team class 
var e = from t in teams 
     select new 
     { 
      TeamID = t.TeamID, 
      TeamName = t.TeamName, 
      NoUsers = t.NumberOfUsers 
     }; 

DataGridView dgv = this.dgvTeams; 
dgv.DataSource = d.ToList(); 
// Same result as 
dgv.DataSource = e.ToList(); 
+1

大多数奥姆斯有'Log'财产,或看到正在执行什么实际的数据库查询的一些其他手段。这是查看精确查询对确切查询提供者所做的工作的好工具。这对于查看执行查询的时间,它们的数量以及查询本身是以更多/更少的信息来查询需要的还是以其他方式低效的方式很有用。 – Servy

+1

谢谢,我发现了Log属性,它为每个返回的行激发一个单独的select查询。因此,我猜想我需要为复杂查询编写SQL语句 – CrazyHorse

+1

'我需要为复杂查询编写SQL'不要进行泛化。某些复杂的查询最终不会被某些ORM有效地映射。您可以尝试调整在LINQ中如何编写查询以更改结果,并且还有可能不同类型的复杂查询将更有效地映射。 – Servy

回答

1

从SQL日志在看到正在生成,它是运行在球队成绩每行一个新的查询,我与CoolStorage开发谁亲切地回答一个整洁的解决方案取得了联系。

有两种选择,或者是OneToMany属性Sysusers可以被标记为[Prefetch]或这可以为每个查询诸如Team.List().WithPrefecth("Users")被明确指定。无论哪种方式,它现在只能运行在用户记录一个额外的查询,而不是每行查询