2011-05-26 83 views
14

我有三个表。其中两人加入,但需要加入左边。我找到了很多代码在linq中执行此操作,但仅在两个表之间执行此操作。连接三个表并使用左外连接

这是我试图在LINQ中重新编码的SQL代码。

SELECT PRSN.NAME 
     ,CO.NAME 
     ,PROD.NAME 
    FROM PERSON PRSN 
    INNER JOIN COMPANY CO ON PRSN.PERSON_ID = CO.PERSON_ID 
    LEFT OUTER JOIN PRODUCT PROD ON PROD.PERSON_ID = PROD.PERSON_ID; 

这是LINQ代码片段,我用它作为基础。我只是无法通过LINQ和左外连接将第三个表(我的示例SQL中的产品)拼凑在一起。样本位于两张桌子之间。感谢您的任何提示。

var leftOuterJoinQuery = 
    from category in categories 
    join prod in products on category.ID equals prod.CategoryID into prodGroup 
    from item in prodGroup.DefaultIfEmpty(new Product{Name = String.Empty, CategoryID = 0}) 
     select new { CatName = category.Name, ProdName = item.Name }; 

迈克尔

回答

34

如何:

var loj = (from prsn in db.People 
      join co in db.Companies on prsn.Person_ID equals co.Person_ID 
      join prod in db.Products on prsn.Person_ID equals prod.Person_ID into prods 
      from x in prods.DefaultIfEmpty() 
      select new { Person = prsn.NAME, Company = co.NAME, Product = x.NAME }) 

编辑:如果你想要做一个左外连接所有表上,你可以做这样的:

var loj = (from prsn in db.People 
      join co in db.Companies on prsn.Person_ID equals co.Person_ID into comps 
      from y in comps.DefaultIfEmpty() 
      join prod in db.Products on prsn.Person_ID equals prod.Person_ID into prods 
      from x in prods.DefaultIfEmpty() 
      select new { Person = prsn.NAME, Company = y.NAME, Product = x.NAME }) 
+0

...非常感谢你!这对我有用。 – MdeVera 2011-05-27 14:55:22

+1

不用担心,交配。我最近遇到了同样的问题......花了一段时间才弄明白。很高兴分享:) – Beno 2011-05-28 10:39:21

+0

@Beno如果你想在每个表上使用左外连接而不是内连接和外连接,你会怎么做? – mko 2012-11-12 21:29:32

5

从另一个Stackoverflow线程取得某个地方,有一个更清晰的方法来执行此操作:

var loj = (from prsn in db.People 
      from co in db.Companies.Where(co => co.Person_ID == prsn.Person_ID).DefaultIfEmpty() 
      from prod in db.Products.Where(prod => prod.Person_ID == prsn.Person_ID).DefaultIfEmpty() 
      select new { Person = prsn.NAME, Company = co.NAME, Product = prod.NAME }) 

这使用linq查询语法和lambda语法的组合来表示最好的结果(我相信是这样)。没有丰富的标识符重新混叠,这是我见过的最简洁的方式。