参加3张或更多桌

时间:2019-07-18 02:37:42

标签: c# sql-server linq model-view-controller

我有一个数据库,并以Entity Framework作为模型连接到Visual Studio 2017。在数据库上,有一些表可以相互连接。将表SELECTION_HISTORY与表USERCANDIDATE类似。但是如何在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 >,表达式>)'不能从用法中推断出来。尝试明确指定类型参数


1 个答案:

答案 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,
        (...)
    }