【问题标题】:Linq Left Outer Join Two Tables on Two FieldsLinq 左外连接两个字段上的两个表
【发布时间】:2018-03-01 05:18:54
【问题描述】:

如何在 linq 的两个字段上左外连接两个表? 我有一个sql:

    select a.*, b.* from courselist as a
                                 left outer join  Summary as b
                                 on a.subject = b.Subject and a.catalog = 
    b.Catalogno 
                                 where a.degree_id = 1 
                                 order by a.sequenceNo

以下是我的 linq 查询,但有错误下划线“join”,调用“Groupjoin”失败。我不知道如何纠正。

    var searchResults = (from a in db.courselist
                                   join b in db.Summary on
                                  new { a.subject,a.catalog } equals
                                   new { b.Subject, b.Catalogno } into ab

                                  where  a.degree_id == 1 
                                  orderby a.degree_sequenceNo
                                  from b  in ab.DefaultIfEmpty()
                                  select new
                                  {
                                      Courselist = a,
                                      Summary = b
                                  }
                                ).ToList();

谢谢。

【问题讨论】:

    标签: linq


    【解决方案1】:

    我再次检查了您的代码, 我发现是错 您只需要像这样指定连接参数名称:

    new { suject = a.subject, catalog = a.catalog } equals
    new { suject = b.subject, catalog = b.Catalogno } into ab
    

    【讨论】:

    • 非常感谢!你是我的救星:)
    【解决方案2】:

    您似乎缺少参考,查询没有错误 尝试使用这个:

    using System.Linq;
    

    【讨论】:

    • 错误消息是“LINQ - 'join 子句中的表达式之一的类型不正确。类型推断在调用 'GroupJoin' 时失败。”但我检查了所有数据类型是否匹配。
    【解决方案3】:

    人们开始使用 LINQ 的主要问题是他们一直以 SQL 方式思考,他们首先设计 SQL 查询,然后将其转换为 LINQ。您需要学习如何以 LINQ 方式思考,您的 LINQ 查询将变得更加整洁和简单。例如,在您的 LINQ 中,您不需要连接。您应该改用Associations/Navigation Properties。更多详情请查看this post

    courselistSummary之间应该有关系,在这种情况下,您可以通过courselist访问Summary,如下所示:

    var searchResults = (from a in db.courselist
                         where  a.degree_id == 1 
                         orderby a.degree_sequenceNo
                         select new {
                             Courselist = a,
                             Summary = a.Summary
                         }).ToList();
    

    如果两者之间没有关系,那么你应该重新考虑你的设计。

    【讨论】:

    • 我正在尝试获取汇总表“描述”字段,这就是我想加入两个表的原因。 Courselist 有一些没有描述的记录,所以我需要做一个左外连接。
    • 是的,但如果设计得当,两者之间肯定有关系,所以当你写a.Summarya.Summary.Description时,它会自动为你做left join。从关系中判断需要哪种类型的连接是足够聪明的。你可以检查我的答案生成的 SQL,你会看到它使用了LEFT JOIN。试试看,courselist 上是否有Summary 属性?
    • 感谢您的回复。我读了一些帖子说它会自动进行左连接,但我测试过它并没有。所以我使用了某人的建议 new { suject = a.subject, catalog = a.catalog } equals new { suject = b.subject, catalog = b.Catalogno } 到 ab 中就可以了。
    • 是的,如果在您的情况下不使用LEFT JOIN,则表明设计不正确。检查您的数据库表和关系并修复它们,而不是试图强制 LINQ 使用会导致不使用索引并且性能会受到很大影响的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多