C# 如何在Linq Lambda表达式中联接多个表?
我得到了这个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
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里面找到它,现在又找到了。