C# SQL to Linq选择分组方式中的多个列
我想将SQL语句转换为LINQ,但在转换时遇到一些问题 sql语句是:C# SQL to Linq选择分组方式中的多个列,c#,sql,linq,C#,Sql,Linq,我想将SQL语句转换为LINQ,但在转换时遇到一些问题 sql语句是: SELECT C.[Call_Date], CC.[Company], R.Resolution, COUNT_BIG(*) AS CNT, SUM([Duration]) AS Total FROM [Calls] C Join [CompanyCharges] CC on [Company_Charge] = [CompanyCharge] Join [Reso
SELECT
C.[Call_Date], CC.[Company], R.Resolution,
COUNT_BIG(*) AS CNT,
SUM([Duration]) AS Total
FROM
[Calls] C
Join
[CompanyCharges] CC on [Company_Charge] = [CompanyCharge]
Join
[Resolutions] R on C.Call_Resolution = R.Resolution
where
Call_Date >= '05/29/2013'
Group By
C.[Call_Date], CC.[Company], CC.[CompanyCharge], R.Resolution, R.Resolution_Order
我写了这样的东西:
var stats = from c in dbContext.Calls
join cc in dbContext.CompanyCharges on c.Company_Charge equals cc.CompanyCharge
join r in dbContext.Resolutions on c.Call_Resolution equals r.Resolution
where (c.Call_Date > "05/29/2013")
group new { c, cc, r } by new { c.Call_Date, cc.CompanyCharge, r.Resolution, r.Resolution_Order } into statsGroup
select new { Count = statsGroup.Count(), ??? };
我设法计算了元素,但我需要一个sum[duration]和来自不同表的一些列。
请与我分享您的智慧。假设
[Duration]
字段是[Calls]
表的一部分:
var stats = /* ... */
select new
{
Count = statsGroup.Count(),
Total = statsGroup.Sum(stat => stat.c.Duration),
};
您可能还希望在新的匿名类型中包含分组字段:
var stats = /* ... */
select new
{
Call_Date = statsGroup.Key.c.Call_Date,
CompanyCharge = statsGroup.Key.cc.CompanyCharge,
Resolution = statsGroup.Key.r.Resolution,
Count = statsGroup.Count(),
Total = statsGroup.Sum(stat => stat.c.Duration),
};
假设
[Duration]
字段是[Calls]
表的一部分:
var stats = /* ... */
select new
{
Count = statsGroup.Count(),
Total = statsGroup.Sum(stat => stat.c.Duration),
};
您可能还希望在新的匿名类型中包含分组字段:
var stats = /* ... */
select new
{
Call_Date = statsGroup.Key.c.Call_Date,
CompanyCharge = statsGroup.Key.cc.CompanyCharge,
Resolution = statsGroup.Key.r.Resolution,
Count = statsGroup.Count(),
Total = statsGroup.Sum(stat => stat.c.Duration),
};
要将SQL查询转换为LINQ查询,可以使用Linqer之类的工具:我想通过解决问题来学习LINQ。当我做不到的时候,我就写在这里,试着从我收到的答案中学习。我不想使用工具。无论如何,谢谢你
Linqer正在出售
该工具确实包含您所寻求的知识。您是否认为,如果该工具向您展示了如何将SQL查询转换为LINQ,那么您将从中学习到与从这里的答案中学习到的一样多的东西,这是公平的假设?我最终安装了Linqer。谢谢你的想法。要将SQL查询转换为LINQ查询,你可以使用Linqer之类的工具:我想通过解决问题来学习LINQ。当我做不到的时候,我就写在这里,试着从我收到的答案中学习。我不想使用工具。无论如何,谢谢你Linqer正在出售
该工具确实包含您所寻求的知识。您是否认为,如果该工具向您展示了如何将SQL查询转换为LINQ,那么您将从中学习到与从这里的答案中学习到的一样多的东西,这是公平的假设?我最终安装了Linqer。谢谢你的想法。似乎你错过了statsGroup之后的Key属性(statsGroup.Key.c.Call_Date,statsGroup.Key.cc.CompanyCharge,statsGroup.Key.r.Resolution)选择新的{g.Key.Call_Date,g.Key.Company,g.Key.Resolution,CNT=g.Count(),Total=(int?)g.Sum(p=>p.c.Duration)}
这是我期待的答案@道格拉斯:请把你的答案编辑成正确的,我会接受的。@rhose87:为什么int?
?我不相信在SQL代码中,Total
是可以为空的?Linqer这样转换它。我刚刚使用了int
。似乎您在statsGroup(statsGroup.Key.c.Call_Date,statsGroup.Key.cc.CompanyCharge,statsGroup.Key.r.Resolution)之后错过了Key属性(statsGroup.Key.Call_Date,g.Key.Company,g.Key.Resolution,CNT=g.Count(),Total=(int?)g.Sum(p=>p.c.Duration)}这是我期待的答案@道格拉斯:请把你的答案编辑成正确的,我会接受的。@rhose87:为什么int?
?我不相信在SQL代码中,Total
是可以为空的?Linqer这样转换它。我只使用了int
。