LINQ如何得到它的结果

时间:2012-12-19 22:10:37

标签: c# linq orm coolstorage

我使用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();

1 个答案:

答案 0 :(得分:1)

从正在生成的SQL日志中看到它为Teams结果中的每一行运行了一个新查询,我联系了CoolStorage开发人员,他们热情地回答了一个简洁的解决方案。

有两个选项,OneToMany的{​​{1}}属性可以标记为Sysusers,也可以为每个查询明确指定,例如[Prefetch]。无论哪种方式,它现在只对用户记录运行一个额外的查询,而不是每行查询