为什么EF 6.13使用Lambda DefaultIfEmpty离开外连接是无效的?

时间:2016-07-12 01:21:29

标签: entity-framework linq lambda outer-join

对不起,我的英语很差,希望你明白。

如果我使用Linq它是正确的,但现在我想使用Lambda。

表1 ExamQuestion

表2 PaperQuestion

没有外键;

var l = db.ExamQuestions
        .Join(db.PaperQuestions, s => s.Id, p => p.QuestionId, (s, p) => new
        ExamQuestionList()
        {
            Id = s.Id,
            Question = s.Question,
            CateTitle = "aaa",
            Option = s.Option,
            IsPass = s.IsPass,
            Answer = s.Answer,
            Difficulty = s.Difficulty,
            IsDelete = s.IsDelete,
            IsExist = true,
            Score = p.Score,
            CreateTime = s.CreateTime
        })

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[Question] AS [Question], 
N'aaa' AS [C1], 
[Extent1].[Option] AS [Option], 
[Extent1].[IsPass] AS [IsPass], 
[Extent1].[Answer] AS [Answer], 
[Extent1].[Difficulty] AS [Difficulty], 
[Extent1].[IsDelete] AS [IsDelete], 
cast(1 as bit) AS [C2], 
[Extent2].[Score] AS [Score], 
[Extent1].[CreateTime] AS [CreateTime]
FROM  [dbo].[ExamQuestions] AS [Extent1]
INNER JOIN [dbo].[PaperQuestions] AS [Extent2] ON [Extent1].[Id] = [Extent2].[QuestionId]

我是用户DefaulifEmpty但无效,左外连接嵌套最外层

var l = db.ExamQuestions
        .Join(db.PaperQuestions, s => s.Id, p => p.QuestionId, (s, p) => new
        ExamQuestionList()
        {
            Id = s.Id,
            Question = s.Question,
            CateTitle = "aaa",
            Option = s.Option,
            IsPass = s.IsPass,
            Answer = s.Answer,
            Difficulty = s.Difficulty,
            IsDelete = s.IsDelete,
            IsExist = true,
            Score = p.Score,
            CreateTime = s.CreateTime
        }).DefaultIfEmpty();


SELECT 
[Project1].[Id] AS [Id], 
[Project1].[Question] AS [Question], 
[Project1].[C1] AS [C1], 
[Project1].[Option] AS [Option], 
[Project1].[IsPass] AS [IsPass], 
[Project1].[Answer] AS [Answer], 
[Project1].[Difficulty] AS [Difficulty], 
[Project1].[IsDelete] AS [IsDelete], 
[Project1].[C2] AS [C2], 
[Project1].[Score] AS [Score], 
[Project1].[CreateTime] AS [CreateTime]
FROM   ( SELECT 1 AS X ) AS [SingleRowTable1]
LEFT OUTER JOIN  (SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Question] AS [Question], 
    [Extent1].[Option] AS [Option], 
    [Extent1].[Answer] AS [Answer], 
    [Extent1].[CreateTime] AS [CreateTime], 
    [Extent1].[Difficulty] AS [Difficulty], 
    [Extent1].[IsPass] AS [IsPass], 
    [Extent1].[IsDelete] AS [IsDelete], 
    [Extent2].[Score] AS [Score], 
    N'aaa' AS [C1], 
    cast(1 as bit) AS [C2]
    FROM  [dbo].[ExamQuestions] AS [Extent1]
    INNER JOIN [dbo].[PaperQuestions] AS [Extent2] ON [Extent1].[Id] = [Extent2].[QuestionId] ) AS [Project1] ON 1 = 1

1 个答案:

答案 0 :(得分:0)

它是一个有效的sql语句,它由linq提供程序生成并由您在OP中发布..

最外层的表[SingleRowTable1]允许始终至少获取一个由空字段组成的空记录,该空字段使用前缀为[Project1]表别名的列名称在语句中指定的别名命名。 / p>

最终连接条件AS [Project1] ON 1 = 1子句将最内部投影所引入的所有行绑定到外部最虚构的表( SELECT 1 AS X ),该表始终为1值并将其附加到最内层投影所获取的每一行。

我希望这是一个明确的解释..

相关问题