2014-03-25 58 views
1

我最近遇到了一些SQL代码,看起来像这样取与在连接条件使用LINQ

SELECT 
    a.Id, 
    b.Id, 
    c.Id, 
    d.Id, 
    b.Name, 
    d.Occupation, 
FROM TableA a 
JOIN TableB b ON a.Id = b.Id 
JOIN TableC c ON b.Id = c.Id AND b.Name = a.Name 
JOIN tableD d ON c.Id = d.Id AND c.Occupation = d.Occupation 

我从来没有使用AND将里面相应的LINQ查询连接像这样(的情况下,我用的是实体框架和LINQ为我的所有查询)。我通常把我所有的与运算里面有where子句是这样的:

var query = from a in dbContext.TableA 
      join b in dbContext.TableB on a.Id equals b.Id 
      join c in dbContext.TableC on b.Id equals c.Id 
      join d in dbContext.TableD on c.Id equals d.Id 
      where b.Name = a.Name 
      where c.Occupation = d.Occupation 
      select new 
      { 
       AId = a.Id, 
       BId = b.Id, 
       CId = c.Id, 
       DId = d.Id, 
       BName = b.Name, 
       DOccupation = d.Occupation, 
      }; 

我可以使用哪些技术来得到我的LINQ查询匹配上面的SQL语句?

回答

1

你可以从你的属性构建匿名类型,像这样对多个属性加入:

var query = from a in dbContext.TableA 
      join b in dbContext.TableB on new { a.Id, a.Name } equals new { b.Id, b.Name } 
      join c in dbContext.TableC on b.Id equals c.Id 
      join d in dbContext.TableD on new { c.Id, c.Occupation } equals new { d.Id, d.Occupation } 
      select new 
      { 
       AId = a.Id, 
       BId = b.Id, 
       CId = c.Id, 
       DId = d.Id, 
       BName = b.Name, 
       DOccupation = d.Occupation, 
      }; 

注意,名称,订单,并在匿名类型的每个属性的数据类型必须是在两个相同为了这个工作,equals的两侧。否则,它们将是两种不同的匿名类型,并且不会相等。

+0

这正是我所期待的。谢谢! – Halcyon