实体框架核心选择/项目可选的一对一特定列

时间:2017-04-27 02:52:32

标签: c# entity-framework-core projection

我正在尝试在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]

0 个答案:

没有答案
相关问题