Linq c# 上的右外连接
Outer right join on Linq c#
如何执行右连接?我正在尝试使用 DefaultIfEmpty()
函数,但没有效果。
这是我的代码:
var AbsByDepartmentADM = (from abs in _dbContext.Absences
join e in _dbContext.DepartementProjects on abs.DepartementProjectID equals e.Id
into g
from c in g.DefaultIfEmpty()
where abs.Profil == "SHT"
group abs by new { abs.DepartementProject.Label } into z
select new
{
Matricule = z.Key.Label,
NumberOfAbsence = z.Count(),
WorkedHours = z.Sum(a => a.WorkedHours),
AbsencesHours = (8* z.Count() - z.Sum(a => a.WorkedHours))
} into H
orderby H.NumberOfAbsence descending
select H);
生成的 sql 查询:
{SELECT
[Project1].[C3] AS [C1],
[Project1].[Label] AS [Label],
[Project1].[C1] AS [C2],
[Project1].[C2] AS [C3],
[Project1].[C4] AS [C4]
FROM ( SELECT
[GroupBy1].[A1] AS [C1],
[GroupBy1].[A2] AS [C2],
1 AS [C3],
CAST( 8 * [GroupBy1].[A3] AS float) - [GroupBy1].[A4] AS [C4],
[GroupBy1].[K1] AS [Label]
FROM ( SELECT
[Extent2].[Label] AS [K1],
COUNT(1) AS [A1],
SUM([Extent1].[WorkedHours]) AS [A2],
COUNT(1) AS [A3],
SUM([Extent1].[WorkedHours]) AS [A4]
FROM [dbo].[Absences] AS [Extent1]
INNER JOIN [dbo].[DepartementProjects] AS [Extent2] ON [Extent1].[DepartementProjectID] = [Extent2].[Id]
WHERE N'SHT' = [Extent1].[Profil]
GROUP BY [Extent2].[Label]
) AS [GroupBy1]
) AS [Project1] ORDER BY [Project1].[C1] DESC}
预期的 sql 查询:
{SELECT
[Project1].[C3] AS [C1],
[Project1].[Label] AS [Label],
[Project1].[C1] AS [C2],
[Project1].[C2] AS [C3],
[Project1].[C4] AS [C4]
FROM ( SELECT
[GroupBy1].[A1] AS [C1],
[GroupBy1].[A2] AS [C2],
1 AS [C3],
CAST( 8 * [GroupBy1].[A3] AS float) - [GroupBy1].[A4] AS [C4],
[GroupBy1].[K1] AS [Label]
FROM ( SELECT
[Extent2].[Label] AS [K1],
COUNT(1) AS [A1],
SUM([Extent1].[WorkedHours]) AS [A2],
COUNT(1) AS [A3],
SUM([Extent1].[WorkedHours]) AS [A4]
FROM [dbo].[Absences] AS [Extent1]
RIGHT JOIN [dbo].[DepartementProjects] AS [Extent2] ON [Extent1].[DepartementProjectID] = [Extent2].[Id]
WHERE N'SHT' = [Extent1].[Profil]
GROUP BY [Extent2].[Label]
) AS [GroupBy1]
) AS [Project1] ORDER BY [Project1].[C1] DESC}
连接在您的 LINQ 代码中似乎没有任何作用,因此我简化并删除了一些特殊用法。我用 let
来做 DRY,但是对于 IQueryable
可能效率不高,我不确定。
var AbsByDepartmentADM2 = from abs in _dbContext.Absences
where abs.Profil == "SHT"
group abs by abs.DepartementProject.Label into absg
let NumberOfAbsence = absg.Count()
let WorkedHours = absg.Sum(abs => abs.WorkedHours)
orderby NumberOfAbsence descending
select new {
Matricule = absg.Key,
NumberOfAbsence,
WorkedHours,
AbsencesHours = (8 * NumberOfAbsence - WorkedHours)
};
var AbsByDepartmentADM = from department in _dbContext.DepartementProjects
join abs in _dbContext.Absences on department.Id equals abs.DepartementProjectID into groupedResult
from groupedResultRight in groupedResult.DefaultIfEmpty()
group groupedResultRight by department.Label into grouped
let NumberOfAbsence = grouped.Count(t => t.DepartementProjectID != null)
let WorkedHours = grouped.Sum(a => a.WorkedHours != null ? a.WorkedHours : 0)
select new
{
DepartmentId = grouped.Key,
NumberOfAbsence,
WorkedHours,
AbsencesHours = (8 * NumberOfAbsence - WorkedHours)
};
如何执行右连接?我正在尝试使用 DefaultIfEmpty()
函数,但没有效果。
这是我的代码:
var AbsByDepartmentADM = (from abs in _dbContext.Absences
join e in _dbContext.DepartementProjects on abs.DepartementProjectID equals e.Id
into g
from c in g.DefaultIfEmpty()
where abs.Profil == "SHT"
group abs by new { abs.DepartementProject.Label } into z
select new
{
Matricule = z.Key.Label,
NumberOfAbsence = z.Count(),
WorkedHours = z.Sum(a => a.WorkedHours),
AbsencesHours = (8* z.Count() - z.Sum(a => a.WorkedHours))
} into H
orderby H.NumberOfAbsence descending
select H);
生成的 sql 查询:
{SELECT
[Project1].[C3] AS [C1],
[Project1].[Label] AS [Label],
[Project1].[C1] AS [C2],
[Project1].[C2] AS [C3],
[Project1].[C4] AS [C4]
FROM ( SELECT
[GroupBy1].[A1] AS [C1],
[GroupBy1].[A2] AS [C2],
1 AS [C3],
CAST( 8 * [GroupBy1].[A3] AS float) - [GroupBy1].[A4] AS [C4],
[GroupBy1].[K1] AS [Label]
FROM ( SELECT
[Extent2].[Label] AS [K1],
COUNT(1) AS [A1],
SUM([Extent1].[WorkedHours]) AS [A2],
COUNT(1) AS [A3],
SUM([Extent1].[WorkedHours]) AS [A4]
FROM [dbo].[Absences] AS [Extent1]
INNER JOIN [dbo].[DepartementProjects] AS [Extent2] ON [Extent1].[DepartementProjectID] = [Extent2].[Id]
WHERE N'SHT' = [Extent1].[Profil]
GROUP BY [Extent2].[Label]
) AS [GroupBy1]
) AS [Project1] ORDER BY [Project1].[C1] DESC}
预期的 sql 查询:
{SELECT
[Project1].[C3] AS [C1],
[Project1].[Label] AS [Label],
[Project1].[C1] AS [C2],
[Project1].[C2] AS [C3],
[Project1].[C4] AS [C4]
FROM ( SELECT
[GroupBy1].[A1] AS [C1],
[GroupBy1].[A2] AS [C2],
1 AS [C3],
CAST( 8 * [GroupBy1].[A3] AS float) - [GroupBy1].[A4] AS [C4],
[GroupBy1].[K1] AS [Label]
FROM ( SELECT
[Extent2].[Label] AS [K1],
COUNT(1) AS [A1],
SUM([Extent1].[WorkedHours]) AS [A2],
COUNT(1) AS [A3],
SUM([Extent1].[WorkedHours]) AS [A4]
FROM [dbo].[Absences] AS [Extent1]
RIGHT JOIN [dbo].[DepartementProjects] AS [Extent2] ON [Extent1].[DepartementProjectID] = [Extent2].[Id]
WHERE N'SHT' = [Extent1].[Profil]
GROUP BY [Extent2].[Label]
) AS [GroupBy1]
) AS [Project1] ORDER BY [Project1].[C1] DESC}
连接在您的 LINQ 代码中似乎没有任何作用,因此我简化并删除了一些特殊用法。我用 let
来做 DRY,但是对于 IQueryable
可能效率不高,我不确定。
var AbsByDepartmentADM2 = from abs in _dbContext.Absences
where abs.Profil == "SHT"
group abs by abs.DepartementProject.Label into absg
let NumberOfAbsence = absg.Count()
let WorkedHours = absg.Sum(abs => abs.WorkedHours)
orderby NumberOfAbsence descending
select new {
Matricule = absg.Key,
NumberOfAbsence,
WorkedHours,
AbsencesHours = (8 * NumberOfAbsence - WorkedHours)
};
var AbsByDepartmentADM = from department in _dbContext.DepartementProjects
join abs in _dbContext.Absences on department.Id equals abs.DepartementProjectID into groupedResult
from groupedResultRight in groupedResult.DefaultIfEmpty()
group groupedResultRight by department.Label into grouped
let NumberOfAbsence = grouped.Count(t => t.DepartementProjectID != null)
let WorkedHours = grouped.Sum(a => a.WorkedHours != null ? a.WorkedHours : 0)
select new
{
DepartmentId = grouped.Key,
NumberOfAbsence,
WorkedHours,
AbsencesHours = (8 * NumberOfAbsence - WorkedHours)
};