LINQ加入来自不同类的值

时间:2012-04-10 12:20:36

标签: c# linq lambda

我是LINQ的新手,对不起,如果我的问题已被提出

我有2个班级

public class Person
{
    int ID {get;set;}
    string FirstName {get;set;}
    string LastName {get;set;}
}

public class House
{
    int ID {get;set;}
    string Address {get;set;}
    string ZipCode {get;set;}
    int PersonId {get;set;}
}

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

IEnumerable<House> ListHouses = GetAllHouses();

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

});

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

我的问题是:

而不是为变量获取人物2次(personFirstName和PersonLastName)有没有办法我可以得到它一次然后使用它。像

这样的东西
PersonForId = GetPersonByID(h.PersonId)
PersonFirstName =  PersonLastName.FirstName,
PersonLastname = PersonLastName.lastname

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

非常感谢你的帮助

2 个答案:

答案 0 :(得分:4)

你非常接近!使用你的代码(并在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
    });

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

有关此类的更多信息,请访问:Returning IEnumerable<T> vs. IQueryable<T>

答案 1 :(得分:3)

using System;
using System.Linq;

class Customer
{
    public int ID { get; set; }
    public string Name { get; set; }
}

class Order
{
    public int ID { get; set; }
    public string Product { get; set; }
}

class Program
{
    static void Main()
    {
    // Example customers.
    var customers = new Customer[]
    {
        new Customer{ID = 5, Name = "Sam"},
        new Customer{ID = 6, Name = "Dave"},
        new Customer{ID = 7, Name = "Julia"},
        new Customer{ID = 8, Name = "Sue"}
    };

    // Example orders.
    var orders = new Order[]
    {
        new Order{ID = 5, Product = "Book"},
        new Order{ID = 6, Product = "Game"},
        new Order{ID = 7, Product = "Computer"},
        new Order{ID = 8, Product = "Shirt"}
    };

    // Join on the ID properties.
    var query = from c in customers
            join o in orders on c.ID equals o.ID
            select new { c.Name, o.Product };

    // Display joined groups.
    foreach (var group in query)
    {
        Console.WriteLine("{0} bought {1}", group.Name, group.Product);
    }
    }
}

输出

山姆买了书 戴夫买了游戏 朱莉娅买了电脑 苏买了衬衫