我使用CoolStorage作为ORM,并对有关查询数据库的频率有疑问。
我正在返回一个团队列表,并且还想显示每个团队中包含的用户数量。我通过调用Team.List()
返回团队,我可以考虑如何返回用户数量的两个选项。一种是向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();
答案 0 :(得分:1)
从正在生成的SQL日志中看到它为Teams结果中的每一行运行了一个新查询,我联系了CoolStorage开发人员,他们热情地回答了一个简洁的解决方案。
有两个选项,OneToMany
的{{1}}属性可以标记为Sysusers
,也可以为每个查询明确指定,例如[Prefetch]
。无论哪种方式,它现在只对用户记录运行一个额外的查询,而不是每行查询