我有一个数据库,并以Entity Framework作为模型连接到Visual Studio 2017。在数据库上,有一些表可以相互连接。将表SELECTION_HISTORY
与表USER
和CANDIDATE
类似。但是如何在C#中连接这些表呢?
我试图连接2个表,但它可以工作,但是当我尝试连接3个表时,我的代码存在一些问题。
List<CandidateInterviewDTO> CandidateInterview = db.CANDIDATEs.Join(db.POSITIONs,
candidate => candidate.JUDUL_POSISI,
position => position.POSITION_ID,
(candidate, position) =>
new CandidateInterviewDTO
{
AppliedPosition = db.POSITIONs.FirstOrDefault(p => p.POSITION_ID == candidate.JUDUL_POSISI).POSITION_NAME,
SuitablePosition = db.POSITIONs.FirstOrDefault(p => p.POSITION_ID == candidate.SUITABLE_POSITION).POSITION_NAME,
Name = candidate.NAMA_LENGKAP,
Source = db.SOURCEs.FirstOrDefault(s => s.SOURCE_ID == candidate.SOURCE_ID).SOURCE_NAME,
PhoneNumber = candidate.NOHP,
Email = candidate.EMAIL
// If i try until this, its work. But when i try the code on below, there is some error with my code. Is it correct ?
}).Join(db.SELECTION_HISTORY,
candidatePosisition => candidatePosisition,
sh => sh.PIC_ID, (candidatePosition, selection) => new CandidateInterviewDTO
{
Name = db.CANDIDATEs.FirstOrDefault(c => c.NAMA_LENGKAP == candidatePosition.Name).NAMA_LENGKAP,
CandidateId = db.SELECTION_HISTORY.FirstOrDefault(sh => sh.PIC_ID == selection.PIC_ID).PIC_ID,
});
错误是
CS0411方法'Queryable.Join
(IQueryable ,IEnumerable ,Expression >,Expression >,表达式 >)'不能从用法中推断出来。尝试明确指定类型参数
答案 0 :(得分:0)
您正在调用Join
,然后将结果链接到另一个Join
调用。
第一个调用返回的类型为IQueryable<CandidateInterviewDTO>
。
因此,当您调用第二个联接时,第二个和第三个参数是lambda,它们返回要比较的键。他们正在返回不同的类型。
-一种类型为CandidateInterviewDTO
-另一种类型是PIC。
通常比LINQ查询语法更喜欢调用链接。但是,当涉及到联接时,查询语法绝对会发光。
以下是使用查询语法进行三种方式联接的方法:
var candidateInterviews = from candidate in db.CANDIDATES
join position in db.POSITIONS
on candidate.JUDUL_POSISI equals position.POSITION_ID
join selectionHistory in db.SELECTION_HISTORY
on position.POSITION_ID equals selectionHistory.PID_ID
select new CandidateInterviewDTO
{
Name = candidate.NAMA_LENGKAP,
(...)
}