我正在尝试构建我的linq-to-sql表达式,以便它只生成一个SQL数据库查询。该查询涉及两个嵌套选择,一个简化的版本是:
var query = from person in People
where person.ID == 1234
select new PersonDetails()
{
ID = person.ID,
FirstName = person.FirstName,
LastName = person.LastName,
Addresses = from address in Addresses
where address.PersonID == person.ID
select address
PhoneNumbers = from number in PhoneNumbers
where number.PersonID == person.ID
select number
}
该表达式将导致执行两个SQL查询。第一个连接Person和PhoneNumbers表并从中提取所需的信息。第二个查询是Addresses表中的一个简单选择。如果我注释掉电话号码属性,那么只有一个连接Person和Addresses的查询被执行,所以L2S引擎确实识别这两种关系。
有没有人知道如何构造LINQ表达式,以便linq-to-sql只生成一个SQL查询?
答案 0 :(得分:1)
(from person in Persons
join address in Addresses
on person.id equals address.personid
join phone in PhoneNumbers
on person.id equals phone.personid
select new
{
Person = person,
Address = address,
Phone = phone
})
.GroupBy(p => p.Person.id)
.Select(g => new
{
Person = g.FirstOrDefault().Person,
Addresses = g.Select(k=>k.Address).Distinct(),
PhoneNumbers = g.Select(k=>k.Phone).Distinct()
});
答案 1 :(得分:1)
您可以使用“let”关键字:
from person in context.Persons
.
.
let Add = from address in Addresses
where address.PersonID == person.ID
select address
这是一个子查询。