构造嵌套的linq-to-sql表达式,以生成单个SQL查询

时间:2010-08-03 04:38:24

标签: linq linq-to-sql

我正在尝试构建我的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查询?

2 个答案:

答案 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

这是一个子查询。

相关问题