Sql 如何在LINQ中组合左JOIN、groupby和SUM?
我想用C#中的LINQ编写SQL查询 这是我的查询(对于每个组织,显示其Id、名称、主管、分析师和“收入”表中的收入总额): 我已经试过这样的方法:Sql 如何在LINQ中组合左JOIN、groupby和SUM?,sql,sql-server,entity-framework,linq,Sql,Sql Server,Entity Framework,Linq,我想用C#中的LINQ编写SQL查询 这是我的查询(对于每个组织,显示其Id、名称、主管、分析师和“收入”表中的收入总额): 我已经试过这样的方法: from o in Organization join director in Employee on o.DirectorId equals director.Id into directorJoin from d in directorJoin.DefaultIfEmpty() join analyst in Employee on o.Ana
from o in Organization
join director in Employee on o.DirectorId equals director.Id into directorJoin
from d in directorJoin.DefaultIfEmpty()
join analyst in Employee on o.AnalystId equals analyst.Id into analystJoin
from a in analystJoin.DefaultIfEmpty()
join income in Income on o.Id equals income.OrganizationId into incomeJoin
group o by new
{
o.Id,
o.Name,
Director = d.FirstName + ' ' + d.LastName,
Analyst = a.FirstName + ' ' + a.LastName,
TotalIncome = (decimal?)incomeJoin.Sum(x => x.Amount)
} into g
select g.Key
但我的程序给我带来了一个例外:
不支持嵌套查询。Operation1='GroupBy'Operation2='MultistreamTest'
我将非常感谢您的帮助。您不想在组键内进行求和-在组外进行求和:
from o in Organization
join director in Employee on o.DirectorId equals director.Id into directorJoin
from d in directorJoin.DefaultIfEmpty()
join analyst in Employee on o.AnalystId equals analyst.Id into analystJoin
from a in analystJoin.DefaultIfEmpty()
join income in Income on o.Id equals income.OrganizationId into incomeJoin
group o by new
{
o.Id,
o.Name,
Director = d.FirstName + ' ' + d.LastName,
Analyst = a.FirstName + ' ' + a.LastName,
i.Amount
} into g
select new
{
g.Key.Id,
g.Key.Name,
g.Key.Director,
g.Key.Analyst,
TotalIncome = (decimal?)g.Sum(i => i.Amount)
}
您可能还需要检查空值,因为您要加入到d、i和a中,我最终使用了建议的。以下是我的问题及其解决方案的简化版本:
型号:
public class Employee
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class Income
{
public int Id { get; set; }
public int OrganizationId { get; set; }
public decimal Amount { get; set; }
}
public class Organization
{
public int Id { get; set; }
public string Name { get; set; }
public int AnalystId { get; set; }
public virtual Employee Analyst { get; set; }
public int DirectorId { get; set; }
public virtual Employee Director { get; set; }
public virtual ICollection<Income> Incomes { get; set; }
}
我刚刚使用了您的查询,但没有得到任何语法错误。你能提供样本数据吗?不要加入。使用导航属性。如果你有像Organization.Incomes这样的东西,这个问题就变得非常简单了。顺便说一句,该错误是由分组表达式中的聚合语句引起的。就像在SQL中一样,它不属于那里。@SurajKumar没有语法错误,但是在实体框架执行期间引发了异常。@GertArnold感谢我使用了导航属性。我只是好奇使用这种方法是否有任何性能问题。导航属性转换为SQL中的
JOIN
语句,因此它们的性能不应该比手动JOIN语句差。很好,我不知道这一点。修正了我的答案。再次感谢
public class Employee
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class Income
{
public int Id { get; set; }
public int OrganizationId { get; set; }
public decimal Amount { get; set; }
}
public class Organization
{
public int Id { get; set; }
public string Name { get; set; }
public int AnalystId { get; set; }
public virtual Employee Analyst { get; set; }
public int DirectorId { get; set; }
public virtual Employee Director { get; set; }
public virtual ICollection<Income> Incomes { get; set; }
}
class Program
{
static void Main(string[] args)
{
var context = new Context();
var queryResult = context.Organizations.Select(x => new
{
x.Id,
x.Name,
Director = x.Director.FirstName + " " + x.Director.LastName,
Analyst = x.Analyst.FirstName + " " + x.Analyst.LastName,
TotalIncome = x.Incomes.Sum(y => y.Amount)
});
}
}