如何在IQueryable LINQ中按int null值进行分组

时间:2016-02-27 00:05:56

标签: c# .net linq

我有一个包含TermNumber的StudentGrades列表,我想按TermNumber对它们进行分组。但是,当我查看结果时,没有返回/分组具有null TermNumbers的结果。

IQueryable<StudentGradeDm> query = GetListQuery().Where(m => m.StudentId == studentId);

IQueryable<StudentGradeDto> groupedQuery = query.GroupBy(m => m.TermNumber)
                                                .Select(m => new StudentGradeDto
                                                {
                                                    TermNumber = m.Key,
                                                    StudentGrades = m.ToList()
                                                });

return groupedQuery;

enter image description here

正如你可以从这里拍摄的可爱截图中看到的那样,有3组,但是,第一组是null,因为它们的TermNumber为空。但理论上,谁在乎它是否为空呢?具有null TermNumber的StudentGrades应该仍然是一个组。

我知道对此的一个解决方法是调用

query.ToList().GroupBy ......

但这对我来说不是一个选项,因为简化的应用程序将采用上面的查询,并将其提供给通用的分页和排序功能,其中只从数据库中提取一部分记录提高绩效。

非常感谢任何专家的意见!

更新:这是生成的SQL

{SELECT 
[Project2].[C2] AS [C1], 
[Project2].[C1] AS [C2], 
[Project2].[C3] AS [C3], 
[Project2].[Id] AS [Id], 
[Project2].[StudentId] AS [StudentId], 
[Project2].[Year] AS [Year], 
[Project2].[TermTypeId] AS [TermTypeId], 
[Project2].[TermNumber] AS [TermNumber], 
[Project2].[ClassId] AS [ClassId], 
[Project2].[GradeId] AS [GradeId], 
[Project2].[FileId] AS [FileId], 
[Project2].[CreatedById] AS [CreatedById], 
[Project2].[CreatedDate] AS [CreatedDate], 
[Project2].[ModifiedById] AS [ModifiedById], 
[Project2].[ModifiedDate] AS [ModifiedDate], 
[Project2].[Deleted] AS [Deleted]
FROM ( SELECT 
    [Distinct1].[C1] AS [C1], 
    1 AS [C2], 
    [Extent2].[Id] AS [Id], 
    [Extent2].[StudentId] AS [StudentId], 
    [Extent2].[Year] AS [Year], 
    [Extent2].[TermTypeId] AS [TermTypeId], 
    [Extent2].[TermNumber] AS [TermNumber], 
    [Extent2].[ClassId] AS [ClassId], 
    [Extent2].[GradeId] AS [GradeId], 
    [Extent2].[FileId] AS [FileId], 
    [Extent2].[CreatedById] AS [CreatedById], 
    [Extent2].[CreatedDate] AS [CreatedDate], 
    [Extent2].[ModifiedById] AS [ModifiedById], 
    [Extent2].[ModifiedDate] AS [ModifiedDate], 
    [Extent2].[Deleted] AS [Deleted], 
    CASE WHEN ([Extent2].[Id] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C3]
    FROM   (SELECT DISTINCT 
        [Extent1].[TermNumber] AS [C1]
        FROM [dbo].[StudentGrade] AS [Extent1]
        WHERE ([Extent1].[Deleted] <> 1) AND ([Extent1].[StudentId] = @p__linq__0) ) AS [Distinct1]
    LEFT OUTER JOIN [dbo].[StudentGrade] AS [Extent2] ON ([Extent2].[Deleted] <> 1) AND ([Extent2].[StudentId] = @p__linq__0) AND ([Distinct1].[C1] = [Extent2].[TermNumber])
)  AS [Project2]
ORDER BY [Project2].[C1] ASC, [Project2].[C3] ASC}

0 个答案:

没有答案