【问题标题】:Construct nested linq-to-sql expression so as to generate a single SQL query构造嵌套的 linq-to-sql 表达式以生成单个 SQL 查询
【发布时间】:2010-08-03 04:38:24
【问题描述】:

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

【问题讨论】:

    标签: linq linq-to-sql


    【解决方案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()
                           });
    

    【讨论】:

    • 这似乎将查询表达式与扩展方法混合在一起。有没有办法只用查询表达式来实现这一点?
    【解决方案2】:

    您可以使用“let”关键字:

    from person in context.Persons
    .
    .
    let Add = from address in Addresses 
                               where address.PersonID == person.ID
                               select address
    

    这是一个子查询。

    【讨论】:

    • 看起来 L2S 在 let 语句周围有一些聪明之处。如果我在我的 linq 表达式中使用两个 let 语句,它仍然会以两个单独的 SQL 查询结束,其中第一个使用左外连接来处理 let。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    相关资源
    最近更新 更多