我正在尝试在Entity Framework Core(1.1.1)中检索可选的一对一关系中的属性子集,但我的查询尝试导致在两个表的查询中检索所有列(已验证使用SQL Profiler)。
举个例子,假设我将这些模型绑定到我的DbContext:
public class Student
{
public int StudentId { get; set; }
public string StudentName { get; set; }
public string Birthday { get; set; }
public string FavoriteIceCream { get; set; }
public string OtherRandomInfoForExample { get; set; }
public virtual StudentAddress Address { get; set; }
}
public class StudentAddress
{
public int StudentId { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public int Zipcode { get; set; }
public string State { get; set; }
public string Country { get; set; }
public virtual Student Student { get; set; }
}
当我尝试将其投影到新模型中时,只选择我想要的列,如下所示:
var studentsCityInfos = _dbContext.Student.AsNoTracking().Select(s => new StudentCityInfo
{
Id = s.StudentId,
Name = s.StudentName,
City = s.Address.City
}).ToList();
结果是一个返回两个表的所有列的查询。我还尝试了以下对导航属性的空检查,并导致相同的结果:
var studentsCityInfos = _dbContext.Student.AsNoTracking().Select(s => new StudentCityInfo
{
Id = s.StudentId,
Name = s.StudentName,
City = s.Address == null ? null : s.Address.City
}).ToList();
这可能只是EF Core 1.1.1中应该优化的投影错误吗?
其他任何人都能想到的替代方法?
作为后退,我可以将其分解为两个查询或使用FromSql编写自己的查询,但我想知道这种情况的正确方法。
为了完整性,我无法控制架构,两个表都有更多的列和大约一百万行。
感谢您抽出宝贵时间阅读并提供答案!
编辑:根据要求,以下是sql探查器结果的示例(手动制作以反映我的场景中的结果):
SELECT [s].[StudentId], [s].[StudentName], [s].[Birthday], [s].[FavoriteIceCream], [s].[OtherRandomInfoForExample], [s].[BusinessFullName], [s].[BusinessLastName], [s.Address].[StudentId], [s.Address].[Address1], [s.Address].[Address2], [s.Address].[City], [s.Address].[Zipcode], [s.Address].[State], [s.Address].[Country]
FROM [Student] AS [s]
LEFT JOIN [StudentAddress] AS [s.Address] ON [s].[StudentId] = [s.Address].[StudentId]
ORDER BY [s.Address].[StudentId]