2017-01-30 111 views
0

我想在LINQ查询中连接3个表以从所有3个表中获取数据。下面是桌子方案的图像:如何使用LINQ连接3个表

enter image description here

查询应选择:SewagePlantName,公司名称和职务

此外,我需要将SewagePlantId限制到给定为ID的列表:

  var sewagePlantIds = UnitOfWork.GetAll<UserGroup>() 
      .Where(group => group.Id == webAppPrincipal.GroupId) 
      .SelectMany(group => group.SewagePlantId).Select(sewageplant => sewageplant.Id).ToList(); 

我对加入3表的顺序有困难,并且在哪里/如何限制SewagePlantId到给定列表。

请帮忙。谢谢你,马努

+0

这是一个糟糕的设计。在*实体*之间使用*关系*,让ORM做任何需要的连接。 'SewagePlant'应该有'公司'的财产。 'Company'应该有'Duties'集合。加载一个'公司',您可以访问所有相关对象 –

+0

但是在这种情况下,SewagePlant有n家公司,而不是相反。 – Manu

+0

因此,使它成为一个集合。只是不要*滥用*您的ORM。创建适当的关系,*不要*尝试加入,就像使用SQL一样。 –

回答

5

你可以尝试类似它的东西,请为联结件

from d in Duty 
join c in Company on d.CompanyId equals c.id 
join s in SewagePlant on c.SewagePlantId equals s.id 
    .Select(m => new 
    { 
     duty = s.Duty.Duty, 
     CatId = s.Company.CompanyName, 
     SewagePlantName=s.SewagePlant.SewagePlantName 
     // other assignments 
    }); 
+0

在第二次连接时,我得到一个错误: - >连接子句中的一个表达式的类型不正确。在“加入”的调用中,Typ推断失败。 – Manu

0
var obj = from trns in context.tblPartyRegistrations 
      join st in context.tblSellingTrans 
      on trns.PartyRegId equals st.Fk_PartyRegId 
      join pt in context.tblPartyRemainings 
      on trns.PartyRegId equals pt.fk_PartyId 
      select new 
      { 
       trns.Name, 
       trns.PhoneNo, 
       trns.Address, 
       st.RecivedAmount, 
       st.Date, 
       st.CustomerType, 
       st.MilkRate, 
       st.Mltr, 
       st.Mkg, 
       st.NtAmnt, 
       st.RemaningAmount, 
       pt.Remainingammount 
      };