来自不同类的 LINQ 连接值

You*_*sef 2 c# linq lambda

我是 LINQ 的新手,如果有人问了我的问题,我很抱歉

我有2节课

public class Person
{
    int ID {get;set;}
    string FirstName {get;set;}
    string LastName {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

public class House
{
    int ID {get;set;}
    string Address {get;set;}
    string ZipCode {get;set;}
    int PersonId {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

我正在将房屋列表保存在 IEnumerable 列表中

IEnumerable<House> ListHouses = GetAllHouses();
Run Code Online (Sandbox Code Playgroud)

GetAllHouses 从数据库中返回房屋列表

我想在 LINQ 中使用 Lamda select 以执行以下操作

var st = ListHouses .Select(h => new
{
    id = h.ID,
    Address= h.Address,
    Zip= h.ZipCode ,
    PersonFirstName = GetPersonByID(h.PersonId ).FirstName, 
    PersonLastname = GetPersonByID(h.PersonId ).lastname

});
Run Code Online (Sandbox Code Playgroud)

其中 GetPersonByID 返回Person具有给定 ID的 Type 对象。然后我取他的名字和姓氏。

我的问题是这样的:

而不是为变量(personFirstName 和 PersonLastName)获取 Person 2 次,有没有一种方法可以获取它一次然后使用它。就像是

PersonForId = GetPersonByID(h.PersonId)
PersonFirstName =  PersonLastName.FirstName,
PersonLastname = PersonLastName.lastname
Run Code Online (Sandbox Code Playgroud)

我正在寻找类似于 Join in SQL 的东西,您可以在其中加入另一个表中的值。

非常感谢您的任何帮助

Jos*_*hua 5

你非常接近!使用您的代码(并公开 House 和 Person 的所有属性),这是使用 LINQ Join 方法的方法:

var st = GetAllHouses().Join(GetAllPersons(),
    outerKey => outerKey.PersonId,
    innerKey => innerKey.ID,
    (house, person) => new
    {
        house.ID,
        house.Address,
        house.ZipCode,
        PersonFirstName = person.FirstName,
        PersonLastname = person.LastName
    });
Run Code Online (Sandbox Code Playgroud)

注意:我建议 GetAllPersons() 和 GetAllHouses() 方法返回 IQueryable 而不是 IEnumerable。这样做将构建表达式(包括连接),这意味着 LINQ-to-SQL(或实体)将构建包含 JOIN 的正确 SQL 语句,而不是枚举集合然后连接。

可以在此处找到有关此类的其他信息:返回 IEnumerable<T> 与 IQueryable<T>