如何在 Linq Lambda 表达式中连接多个表?

How To Join Many Tables In Linq Lambda Expressions?

我得到了这个 Lambda 表达式,但它不起作用 Correctly.Does 没有 Return 任何 Thing.Would 请你帮我解决这个问题:

    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();

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

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 连接,因此如果没有匹配记录,它们中的任何一个都可能导致查询 return 空结果。

问题很可能出在这个连接

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

而不是 PartyIDRef 我想应该是 PersonIDRef.