Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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
Sql 如何在LINQ中组合左JOIN、groupby和SUM?_Sql_Sql Server_Entity Framework_Linq - Fatal编程技术网

Sql 如何在LINQ中组合左JOIN、groupby和SUM?

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

我想用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.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)
        });

    }
}