C# LINQ是如何得到结果的

C# LINQ是如何得到结果的,c#,linq,orm,coolstorage,C#,Linq,Orm,Coolstorage,我将CoolStorage用作ORM,对于数据库的查询频率有一个疑问 我将返回一个团队列表,还希望显示每个团队中包含的用户数。我通过调用Team.List()返回团队,我可以考虑两个选项来返回用户数量。一种是向Team类添加属性,该属性返回其[OneToMany]系统用户的计数,另一种是对Team.List()返回的结果使用LINQ。下面的代码演示了两种方法,它们都返回相同的结果 我试图理解这是如何影响数据库交互的,例如,它会首先返回一个团队列表,然后对每个团队运行一个单独的查询以获得用户数量吗

我将CoolStorage用作ORM,对于数据库的查询频率有一个疑问

我将返回一个团队列表,还希望显示每个团队中包含的用户数。我通过调用
Team.List()
返回团队,我可以考虑两个选项来返回用户数量。一种是向Team类添加属性,该属性返回其[OneToMany]系统用户的计数,另一种是对
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();
CSList teams=Team.List();
//计算物体的数量
var d=团队中的t
选择新的
{
TeamID=t.TeamID,
TeamName=t.TeamName,
nouser=t.SysuserTeams.Count
};
//使用添加到团队类的属性
var e=团队中的t
选择新的
{
TeamID=t.TeamID,
TeamName=t.TeamName,
nouser=t.NumberOfUsers
};
DataGridView dgv=this.dgvTeams;
dgv.DataSource=d.ToList();
//结果与
dgv.DataSource=e.ToList();

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


有两个选项,可以将
Sysusers
OneToMany
属性标记为
[Prefetch]
,也可以为每个查询明确指定此属性,例如
Team.List().withfifth(“用户”)
。无论哪种方式,它现在只对用户记录运行一个额外的查询,而不是每行查询

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


有两个选项,可以将
Sysusers
OneToMany
属性标记为
[Prefetch]
,也可以为每个查询明确指定此属性,例如
Team.List().withfifth(“用户”)
。无论哪种方式,它现在只对用户记录运行一个额外的查询,而不是每行查询

大多数ORM都有一个
Log
属性,或者其他一些方法来查看实际执行的DB查询。这是一个很好的工具,可以查看您的精确查询对精确查询提供者的作用。这有助于查看何时执行查询、查询的数量,以及查询本身是否在查询所需的更多/更少的信息或以其他方式效率低下。谢谢,我找到了Log属性,它正在为返回的每一行触发一个单独的select查询。所以我想我需要为复杂查询编写SQL
我需要为复杂查询编写SQL
不要这样概括。某些复杂的查询最终无法被某些ORM有效地映射。您可以尝试调整在LINQ中编写查询的方式,以可能更改结果,也可能不同类型的复杂查询将更有效地映射。大多数ORM都有一个
Log
属性,或者其他一些方法来查看实际执行的DB查询。这是一个很好的工具,可以查看您的精确查询对精确查询提供者的作用。这有助于查看何时执行查询、查询的数量,以及查询本身是否在查询所需的更多/更少的信息或以其他方式效率低下。谢谢,我找到了Log属性,它正在为返回的每一行触发一个单独的select查询。所以我想我需要为复杂查询编写SQL
我需要为复杂查询编写SQL
不要这样概括。某些复杂的查询最终无法被某些ORM有效地映射。您可以尝试调整在LINQ中编写查询的方式,以可能更改结果,而且不同类型的复杂查询也可能更有效地映射。