【发布时间】:2016-04-07 03:31:06
【问题描述】:
考虑以下模型:
public class News
{
public int Id { get; set; }
public string Title { get; set; }
public Branch Branch { get; set; }
public int? BranchId { get; set; }
}
public class NewsDto
{
public int Id { get; set; }
public string Title { get; set; }
public BranchDto Branch { get; set; }
}
public class Branch
{
public int Id { get; set; }
public string Name { get; set; }
public List<News> News { get; set; } = new List<News>();
}
public class BranchDto
{
public int Id { get; set; }
public string Name { get; set; }
}
这里我们在News 和Branch 之间有一个可选的关系(一对多)。
我们发出以下查询:
context.News
.Select(dto => new NewsDto()
{
Id = dto.Id,
Title = dto.Title,
Branch = dto.Branch == null ? null : new BranchDto()
{
Id = dto.Branch.Id,
Name = dto.Branch.Name
}
}).ToList();
EF6
生成的查询是:
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Title] AS [Title],
CASE WHEN ([Extent2].[Id] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1],
[Extent1].[BranchId] AS [BranchId],
[Extent2].[Name] AS [Name]
FROM [dbo].[News] AS [Extent1]
LEFT OUTER JOIN [dbo].[Branches] AS [Extent2] ON [Extent1].[BranchId] = [Extent2].[Id]
它应该是这样的:CASE WHEN 之后的左外连接来处理对 Branches 表的空引用。
EF7 (RC1)
生成相同的查询:
SELECT
[dto].[Id],
[dto].[Title],
[dto].[BranchId] IS NULL,
[dto].[BranchId],
[dto.Branch].[Name]
FROM [News] AS [dto]
INNER JOIN [Branch] AS [dto.Branch] ON [dto].[BranchId] = [dto.Branch].[Id]
我真的不明白为什么会这样。这种关系显然是可选的,所以内部连接是完全错误的。除此之外,[dto].[BranchId] IS NULL 行给出了System.Data.SqlClient.SqlException: Incorrect syntax near the keyword 'IS',所以我猜这甚至不是有效的 sql。
仅当关系是可选的时才会发生这种情况。怎么回事?
【问题讨论】:
-
这里要达到什么目的
[dto].[BranchId] IS NULL -
这一行不是我写的,这是ef7自己生成的。是的,看起来它是无效的 sql。
-
您尝试过最新的 (RC2) 位吗?
-
Word 是 ef 家伙尚未实现外连接。他们首先试图解决一些复杂问题。我不确定这是否已经解决,我没有时间尝试最新的位。
标签: asp.net sql-server entity-framework-core