我是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的东西,你可以从另一个表中加入一个值。
非常感谢你的帮助
答案 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);
}
}
}
输出
山姆买了书 戴夫买了游戏 朱莉娅买了电脑 苏买了衬衫