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,谢谢你的帮助,我几乎什么都懂,但仍然不明白这里的关键是什么。这是什么领域?