【问题标题】:How To Join Many Tables In Linq Lambda Expressions?如何在 Linq Lambda 表达式中加入多个表?
【发布时间】:2016-07-01 21:23:12
【问题描述】:

我得到了这个 Lambda 表达式,但不能正常工作。不返回任何东西。请你帮我解决这个问题:

    var query = db.Cheque
                    .Join(db.Contracts,
                    C => C.ContractIDRef,
                    Con => Con.ContractID,
                    (C, Con) => new { Cheques1 = C, Contracts1 = Con })
                    .Join(db.Parties,
                    Con => Con.Contracts1.ContractID,
                    Pt => Pt.ContractIDRef,
                    (Con, Pt) => new { Contract2 = Con, Parites1 = Pt })
                    .Join(db.Persons,
                    Pt => Pt.Parites1.PartyIDRef,
                    P => P.PersonID,
                    (Pt, P) => new { Parites2 = Pt, Persons1 = P })
                    .Join(db.Company,
                    Pt => Pt.Parites2.Parites1.CompanyIDRef,
                    Com => Com.CompanyID,
                    (Pt, Com) => new { Parites3 = Pt, Company1 = Com })
                    .Join(db.Bank,
                    C => C.Parites3.Parites2.Contract2.Cheques1.BankIDRef,
                    B => B.BankID,
                    (C, B) => new { Cheque2 = C, Bank1 = B })
                    .Join(db.Flats,
                    Con => Con.Cheque2.Parites3.Parites2.Contract2.Contracts1.FlatIDRef,
                    F => F.FlatID,
                    (Con, F) => new { Contract3 = Con, Flat1 = F })
                    .Join(db.Projects,
                    F => F.Flat1.ProjectIDRef,
                    Pr => Pr.ProjectID,
                    (F, Pr) =>
                    new
                    {
                        ChequeNumber = F.Contract3.Cheque2.Parites3.Parites2.Contract2.Cheques1.ChequeNo,
                        ChequeIDRef = F.Contract3.Cheque2.Parites3.Parites2.Contract2.Cheques1.ChequeIDRef,
                        ChequePrice = F.Contract3.Cheque2.Parites3.Parites2.Contract2.Cheques1.Amount,
                        BankName = F.Contract3.Bank1.BankName,
                        BranchName = F.Contract3.Cheque2.Parites3.Parites2.Contract2.Cheques1.BranchName,
                        ChequeDate = F.Contract3.Cheque2.Parites3.Parites2.Contract2.Cheques1.ChequeDate,
                        AccountNumber = F.Contract3.Cheque2.Parites3.Parites2.Contract2.Cheques1.AccNo,
                        AccountOwner = F.Contract3.Cheque2.Parites3.Parites2.Contract2.Cheques1.ChequeOwnerName,
                    }
                    )
`.Where(Total => SelectedChequesList.Contains(Total.ChequeIDRef.Value)).ToList();

【问题讨论】:

  • 您可以开始删除 ToList 并查看查询(query.ToString() 应该包含 SQL 查询)并尝试调试它。
  • bubi 谢谢,非常有用

标签: c# entity-framework linq lambda linq-to-entities


【解决方案1】:

我将从将上面的内容转换为查询语法开始。虽然我是方法语法的粉丝,但在涉及多个连接的复杂查询中使用它确实很痛苦。我需要大量时间来阅读并尝试遵循上述查询,所以让我们这样做吧:

var query =
    from cheque in db.Cheque
    join contract in db.Contracts on cheque.ContractIDRef equals contract.ContractID
    join party in db.Parties on contract.ContractID equals party.ContractIDRef
    join person in db.Persons on party.PartyIDRef equals person.PersonID
    join company in db.Companies on party.CompanyIDRef equals company.CompanyID
    join bank in db.Bank on cheque.BankIDRef equals bank.BankID
    join flat in db.Flats on contract.FlatIDRef equals flat.FlatID
    join project in db.Projects on flat.ProjectIDRef equals project.ProjectID
    where SelectedChequesList.Contains(cheque.ChequeIDRef.Value)
    select new
    {
        ChequeNumber = cheque.ChequeNo,
        ChequeIDRef = cheque.ChequeIDRef,
        ChequePrice = cheque.Amount,
        BankName = bank.BankName,
        BranchName = cheque.BranchName,
        ChequeDate = cheque.ChequeDate,
        AccountNumber = cheque.AccNo,
        AccountOwner = cheque.ChequeOwnerName,
    };

现在,可以看到的一件事是大多数连接都没有使用。但是假设出于某种原因需要它们。请注意,所有连接都是INNER 连接,因此如果没有匹配的记录,它们中的任何一个都可能导致查询返回空结果。

问题很可能出在这个连接中

join person in db.Persons on party.PartyIDRef equals person.PersonID

我猜应该是PersonIDRef,而不是PartyIDRef

【讨论】:

  • 奇怪的想法,什么更重要,一个 lambda 表达式或工作查询?但是您错过了其中一个连接中使用的可能不正确的字段的要点。无论如何,只需在您的 lambda 中修复 Pt => Pt.Parites1.PartyIDRef 即可。我花了很长时间才在你的 lambda 中找到它,现在再次找到它也是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多