2014-07-14 41 views
0

嗨,我是使用4个表不以某些空表工作..LINQ multible加入

有时不具备此表中(教育或地址或证书) 信息,所以结果来了空.. 如果有信息我怎么说? 例如

**PersonTable** 

PersonId PersonName 
1453   george 

**Certificate Table** 

CertificateId PersonId CertificateName (0 records) 


**Addres Table** 

AddresId PersonId Adress 
1   1453  ...... 
2   1453  ..... 
3   1453  ...... 
4   1453  ...... 
5   1453  ........ 

**EducationTable** 

EducationId PersonId Education 
1    1453   school name 


**BankTable** 

BankId  PersonId   Bank (0 records) 


Person table = 1 records 
Certificates = 0 records 
Address = 5 records 
Education = 1 records 
Bank = 0 records 

var query = (from p in DbEntities.t_Person 
         join q in DbEntities.t_Address on p.PersonId equals q.addressId 
         join n in DbEntities.t_Education on p.PersonId equals n.EduId 
         join j in DbEntities.t_Certificate on p.PersonId equals j.CertificateId 
         join f in DbEntities.t_BankAccount on p.PersonId equals f.BankId 
         where p.PersonId.Equals(id) 
         select new { p, q, n, j, f }).FirstOrDefault(); 

返回查询值零,

我不明白为什么这些价值?

Person table = 1 records 
Address = 5 records 
Education = 1 records 

我想过这个问题,但没有

var query = (from p in DbEntities.t_Person 
        where p.PersonId.equlas(id) 
        select p).singleOrDefault(); 

query = from p in dbEntities.Address 
       WHERE P.AddressId.equlas(query.PersonId) 
      select p; 

回答

0

这是因为你在做内部连接,这将只返回记录,如果所有的加盟条件都满足!看起来你想要做一个LEFT JOIN,它将返回左表中的所有行,并且从右表返回找到的任何记录,否则返回null。 Here是一个很好的文章,解释了不同类型的连接,包括图表!

Linq-to-Entities进行左连接的方式是DefaultIfEmpty()。有关使用示例,请参见MSDN

+0

谢谢你jeff ... – user3816319

+1

没问题!如果这是您寻求的解决方案,请标记为答案。 –