【问题标题】:LINQ join lambda syntax - need to translate this from queryLINQ 连接 lambda 语法 - 需要从查询中翻译它
【发布时间】:2016-10-08 01:22:34
【问题描述】:

我已经在这个问题上敲了大约 2 天了。

我有一个非常高级的 SQL Server 查询,需要将其转换为 LINQ。

涉及到:

  • 6 个内部连接
  • 包含每个表中的列的选择
  • 一个特定的 groupby,它涉及每个表中的大量列。

我还需要能够动态构建 where 子句谓词(使用 predicatebuilder),所以如果我想在正确的位置应用 where 子句,我想我需要使用 lambda 表达式(经过多次试验和错误)。

这是我很难翻译的部分:

var query = from order in orders                         
            join customer in customers on order.CustomerID equals customer.ID
            join ordersection in ordersections on order.ID equals ordersection.OrderID
            join ticket in tickets on ordersection.ID equals ticket.OrderSectionID
            join evt in events on ticket.EventID equals evt.id
            join client in clients on evt.ClientID equals client.id
            join venue in venues on evt.VenueID equals venue.VenueID

非常感谢您抽出宝贵时间(提前)!

【问题讨论】:

  • 当前使用Joins 发布的查询是否有效,或者您也需要解决方案
  • 这里没有实际问题。这只是一堆陈述。你应该阅读How to Ask。我们需要有一些具体的工作和一个明确的问题要解决。
  • @Enigmativity,确实花在理解问题上的时间比设计解决方案要多
  • 不确定您是否拥有数据库。最好将此查询实现为视图并在 LINQ 中从该视图进行查询。在这种情况下,SQL 查询比 LINQ 更易于维护。
  • 您展示的内容不需要翻译成 LINQ。它是 LINQ。它是最适合连接的语法——查询语法。如果这是您的问题,那么将其转换为更笨重的方法语法是没有意义的。让编译器为你做这件事。那么,在翻译方面,您的问题到底是什么?至于构建动态 where 子句,请查找“谓词生成器 + LINQ”并从众多热门中挑选。

标签: c# sql-server linq join lambda


【解决方案1】:

以下是您的查询的Linq 版本,正如预期的那样:

var query = orders.Join(customers, o => o.CustomerID, c => c.ID, (o, c) => new { o, c })
                       .Join(ordersections, o => o.o.ID, os => os.OrderID, (o, os) => new {o = o.o, c = o.c,os})
                       .Join(tickets, o => o.os.ID, t => t.OrderSectionID, (o, t) => new {o = o.o, c = o.c,os = o.os,t})
                       .Join(events, o => o.t.EventID, e => e.id, (o, e) => new {o = o.o, c = o.c,os = o.os,t = o.t,e})
                       .Join(clients, o => o.e.ClientID, cl => cl.id, (o, cl) => new {o = o.o, c = o.c,os = o.os,t = o.t,e = o.e,cl})
                       .Join(venues, o => o.e.VenueID, v => v.VenueID, (o, v) => new {o = o.o, c = o.c,os = o.os,t = o.t,e = o.e,cl = o.cl,v});

query 的最终结果/架构是由 order,customer,ordersection,ticket,evt,client,venue 组成的匿名类型,您可能希望将其转换为类型化实体/DTO。

在这种情况下,我们将投影每个连接的结果并采用完整的对象而不是少数属性

【讨论】:

  • 请注意,您不需要 o = o.o 等中的所有名称 - 只需 new { o.o, o.c, o.os etc } 即可。
  • @JonSkeet 感谢您提供的信息,我认为这可能会导致多个级别的引用访问
  • 不,完全一样 - 它只是从用于初始化它的表达式中推断出名称。
  • @MrinalKamboj 非常感谢!这是完美的解决方案,而且效果很好。也谢谢乔恩!
【解决方案2】:

Mrinal Kamboj answer 已经展示了如何将示例查询语法转换为方法语法。但是,这并不是绝对必要的,因为您可以通过简单地在最后添加匿名类型投影来实现相同的效果,然后对其执行其余的(动态过滤、最终投影):

var query =
    from order in orders                         
    join customer in customers on order.CustomerID equals customer.ID
    join ordersection in ordersections on order.ID equals ordersection.OrderID
    join ticket in tickets on ordersection.ID equals ticket.OrderSectionID
    join evt in events on ticket.EventID equals evt.id
    join client in clients on evt.ClientID equals client.id
    join venue in venues on evt.VenueID equals venue.VenueID
    select new { order, customer, ordersection, ticket, evt, client, venue };

query = query.Where(dynamicFilter);
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    相关资源
    最近更新 更多