Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这个查询是如何工作的?_C#_Sql_Linq_Tsql_Linq To Sql - Fatal编程技术网

C# 这个查询是如何工作的?

C# 这个查询是如何工作的?,c#,sql,linq,tsql,linq-to-sql,C#,Sql,Linq,Tsql,Linq To Sql,所以,我有一段代码 var _activeContract = (from cnt in UnitOfWork.Context.Contract.Where(w => w.IS_DELETED == 0 && w.CONTRACT_STATUS_ID == (int)NemsKysContractStatusEnum.Aktif) join sei in UnitOfWork.Context.SiteExtendedInfoList.Where(w => w.

所以,我有一段代码

var _activeContract = (from cnt in UnitOfWork.Context.Contract.Where(w => w.IS_DELETED == 0 && w.CONTRACT_STATUS_ID == (int)NemsKysContractStatusEnum.Aktif)
    join sei in UnitOfWork.Context.SiteExtendedInfoList.Where(w => w.IS_DELETED == 0) on cnt.SITE_ID equals sei.SITE_ID
    join sr in UnitOfWork.Context.Subregion.Where(w => w.IS_DELETED == 0) on sei.RN_SUBREGION_ID equals sr.ID
    join r in UnitOfWork.Context.Region.Where(w => w.IS_DELETED == 0) on sr.REGION_ID equals r.ID
    join mr in UnitOfWork.Context.MainRegion.Where(w => w.IS_DELETED == 0) on r.MAIN_REGION_ID equals mr.ID
    select new { MRNAME = mr.NAME, cnt.ID }).GroupBy(g => g.MRNAME).OrderBy(t => t.Key).Select(s => new { name = s.Key, data = s.Count() }).ToList();
我听不懂最后一行

据我所知,它说要创建输出序列,它的每个元素都是 {MRNAME=mr.NAME,cnt.ID}即anon对象。然后我们按MRNAME对这个序列进行分组,然后按键部分OrderByt=>t.Key对它进行排序。什么钥匙?这把钥匙是哪里来的?因为我们只有两个字段:MRNAME和cntID,不是吗

那我就不明白怎么做了 选择=>new{name=s.Key,data=s.Count}有效。它在以前的{MRNAME=mr.NAME,cnt.ID}对象序列的每个元素上创建一个新序列,该序列的每个元素都是类似{NAME=s.Key,data=s.Count}的对象

再一次,我不明白这里的关键是什么,我们用s来计算字段数据的数量。我们精确地计算了多少

  from ...
  select new { MRNAME = mr.NAME, cnt.ID })  //1
.GroupBy(g => g.MRNAME)  //2
.OrderBy(t => t.Key)  //3
.Select(s => new { name = s.Key, data = s.Count() })  //4
.ToList();
GroupBy输出的每个元素都是一个IGrouping,它有一个Key属性

逐个调用读取代码:

//1 Each element has MRName and ID properties.
//2 Group the elements by the MRName property, we now have a query consisting of groups.
//3 Order the groups by the Key, which is the MRName property.
//4 Turn each group into a new element.  Each element has a name and data property.

如果在上下文中创建关系和导航属性,则不需要联接。ORM的工作是根据您定义的关系创建连接。事实上,整个查询很难理解,可能会导致非常复杂和缓慢的SQLquery@PanagiotisKanavos,非常感谢您的建议,我理解您的权利,但此代码不是我的,我没有权利更改它。所以最后一行我还有一个问题,它似乎在执行一个不需要的选择-GroupBy本身就足够了。看起来这是试图执行选择名称count*。。。按名称分组按名称排序。您可以使用.GroupBymr=>mr.Name.Selectg=>new{Neme=g.Key,Count=g.Count}.OrderByt=>t.Name@PanagiotisKanavos,谢谢你的帮助,我几乎什么都懂,但仍然不明白这里的关键是什么。这是什么领域?