C# 仅选择联接表时EF Core联接

C# 仅选择联接表时EF Core联接,c#,entity-framework,linq,entity-framework-core,C#,Entity Framework,Linq,Entity Framework Core,我有三种型号(最少): 我正在尝试在personaddress和Address之间进行连接,这样我只剩下Address类型的列表/查询 通过使用教程,我成功地获得了PersonalAddress和Address的匿名类型集合,但我确信下面的查询有一个简单的修改,它给出了我想要的: var anonTypeOfTwoTables = _context.PersonAddresses .Where(x => x.Person.PersonId == pe

我有三种型号(最少):

我正在尝试在
personaddress
Address
之间进行连接,这样我只剩下
Address
类型的列表/查询

通过使用教程,我成功地获得了
PersonalAddress
Address
的匿名类型集合,但我确信下面的查询有一个简单的修改,它给出了我想要的:

        var anonTypeOfTwoTables = _context.PersonAddresses
            .Where(x => x.Person.PersonId == personId)
            .Join(_context.Addresses,
            person => person.Person.PersonId,
            address => address.AddressId,
            (address, personAddress) => new
            {
                Address = address,
                PersonAddress = personAddress
            });
其中,
personId
只是传递给包含方法的一个int


我可以让查询只返回
列表地址=_context…
而不是
var anonTypeOfTwoTables…

如果您对EF模型进行了映射配置,则不需要显式调用join

 var anonTypeOfTwoTables = _context.PersonAddresses
        .Where(x => x.Person.PersonId == personId)
        .Join(_context.Addresses,
        person => person.Person.PersonId,
        address => address.AddressId,
        (address, personAddress) => new
        {
            Address = address,
            PersonAddress = personAddress
        });
结果是

var anonTypeOfTwoTables = _context.PersonAddresses
        .Where(x => x.Person.PersonId == personId)
        .Select( x => new {
            PersonAddress = x,
            Address = x.Address
        });

如果您只需要地址,为什么要创建一个包含两个记录的匿名类型?为什么不
(address,PersonalAddress)=>address
?我不知道为什么,我只是在学习一个关于加入的教程!如果您不小心,这些教程将引导您采用先解决问题,后解决问题的编程方式。这里似乎就是这样,因为您也不需要显式连接来实现您的目标。请看@DervişKayımbaşıoğluIt的答案,它是我找到的最接近我想要的东西,但我不知道如何将它最小化到我想要的程度。如果我这样做了,我就不需要问这个问题了:D-答案帮助我发现了EF的乐趣,我甚至能够使用它并在三个表中进行选择,而无需在项目的另一部分使用联接。
var anonTypeOfTwoTables = _context.PersonAddresses
        .Where(x => x.Person.PersonId == personId)
        .Select( x => new {
            PersonAddress = x,
            Address = x.Address
        });