Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Linq Lambda表达式中联接多个表?_C#_Entity Framework_Linq_Lambda_Linq To Entities - Fatal编程技术网

C# 如何在Linq Lambda表达式中联接多个表?

C# 如何在Linq Lambda表达式中联接多个表?,c#,entity-framework,linq,lambda,linq-to-entities,C#,Entity Framework,Linq,Lambda,Linq To Entities,我得到了这个Lambda表达式,但它不能正常工作。不会返回任何东西。请帮我解决这个问题: var query = db.Cheque .Join(db.Contracts, C => C.ContractIDRef, Con => Con.ContractID, (C, Con) => new { Cheques

我得到了这个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();

我将首先将上述内容转换为查询语法。虽然我是方法语法的粉丝,但在涉及多个连接的复杂查询中使用它确实是一件痛苦的事情。我需要很多时间阅读并尝试按照上面的查询进行操作,所以让我们这样做:

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,
    };
现在,可以看到的一件事是,大多数连接都没有使用。但假设它们是出于某种原因需要的。请注意,所有联接都是内部联接,因此如果没有匹配的记录,任何联接都可能导致查询返回空结果

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

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

我想它应该是类似于
PersonIDRef

的东西,而不是
PartyIDRef
,你可以开始删除ToList并查看查询(query.ToString()应该包含SQL查询),然后尝试调试它。bubi谢谢,非常有用奇怪的想法,更重要的是,lambda表达式还是工作查询?但是您忽略了一个要点,即其中一个联接中使用的字段可能不正确。无论如何,只需在lambda中修复
Pt=>Pt.Parites1.PartyIDRef
。我花了很长时间才在你的lambda里面找到它,现在又找到了。