C# 使用LINQ的连接条件中的ANDing

C# 使用LINQ的连接条件中的ANDing,c#,sql,linq,entity-framework,tsql,C#,Sql,Linq,Entity Framework,Tsql,我最近遇到了一些类似这样的SQL代码 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

我最近遇到了一些类似这样的SQL代码

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
我从未在相应的LINQ查询中使用过像这样的ANDs内部联接(对于上下文,我对所有查询都使用实体框架和LINQ)。我通常把所有的AND都放在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,
            };
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,
            };

我可以使用什么技术使我的LINQ查询与上面的SQL语句匹配?

通过从属性构造匿名类型,可以连接多个属性,如下所示:

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,
            };
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
的两侧必须相同,这样才能工作。否则,它们将是两种不同的匿名类型,并且不会相等。

这正是我要寻找的。非常感谢。